【问题标题】:GCC: Specifying static/dynamic libraries to build againstGCC:指定要构建的静态/动态库
【发布时间】: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 选项,提供的链接器日志可能会有所帮助。

标签: c++ c boost makefile


【解决方案1】:

最后,有一个“LIBPATH=”而不是“LIBPATH+=”语句覆盖了库包含路径。已解决。

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2011-11-04
    相关资源
    最近更新 更多