【发布时间】:2012-03-13 16:16:36
【问题描述】:
我有一个简单的 C++ 项目,其结构如下: - 一个基础项目(即:包含 main() ),以及与其他所有内容的链接 -- 一些自定义库都构建为静态库(即:.a 文件) ---这些静态库之一使用共享目标文件(即:.so 文件)中的功能
因此,例如,在所有初始编译完成后,项目在链接时的显示方式(在树视图中):
-myApp (the main application)
--libaudio.a (the audio library I made)
--libnetwork.a (the networking library I made)
--libvideo.a (the video library I made)
--libboost.a (boost library)
最初,这个项目构建得很好。我只需要确保我的 makefile 中有这样的简单行:
LIBS+=audio network video
最近,我不得不更改我的音频库的工作方式。我现在需要使用第三方库,我只有头文件(.h)和共享对象(.so)文件。所以链接时的新结构是这样的:
-myApp (the main application)
--libaudio.a (the audio library I made)
---libthirdparty.so (contains third-party audio handling functions)
--libnetwork.a (the networking library I made)
--libvideo.a (the video library I made)
--libboost.a (boost library)
实际上,这意味着我有一个应用程序,其中链接了一个静态库,该库调用外部共享对象。因此,我将头文件放在适当的位置,这样在编译 libaudio.a 时不会出现任何构建错误,并将 libthirdparty.so 文件放在链接器搜索我所有已安装库的位置。
此时,我无法构建东西。它只是看不到 libthirdparty.so 文件,即使我知道它位于链接器默认搜索的位置。出于某种原因,包装我的 libaudio 代码,如下例所示(从 www.cplusplus.com 借来)修复了构建错误:
my_C_CPP_Header.h:
#ifndef MY_C_CPP_HEADER
#define MY_C_CPP_HEADER
/*check if the compiler is of C++*/
#ifdef __cplusplus
extern "C" {
int myOtherCfunc(int arg1, int arg2); /* a C function */
}
#endif
void myCppFunction1(); /* C++ function */
void myCppFunction2(); /* C++ function */
/*check if the compiler is of C++ */
#ifdef __cplusplus
}
#endif
#endif
现在,我有一个新问题。现在它正在构建,它不再在 libboost.a 中静态链接,而是由于 libboost.so 不存在而在启动时崩溃。所以,如果我设法让它构建,这个设置会以某种方式破坏 libboost 的编译方式。
欢迎提出任何建议。提前谢谢大家。
【问题讨论】:
-
你没有给我们太多的继续。你添加了什么“包装”? (你似乎有一个额外的右括号。)你用什么命令来链接?你是如何修改 makefile 来处理这个新库的?
-
我将头文件(即:libthirdparty.h)包装在:#ifdef cplusplus extern c { ........ } #endif .
-
libthirdparty.h,而不是“我的 libaudio 代码”?
-
没错,libthirdparty.h
-
您通过添加
extern "C"包装器解决的问题显然是因为第三方库具有 C API,但您从它们获得的标头尚未与 C++ 兼容 - 您添加的包装器让他们如此。为了帮助解决似乎与 boost 库有关的问题,如果添加-Wl --verbose选项,提供的链接器日志可能会有所帮助。