包括共享库(.so)和CMake

时间:2013-09-05 21:12:43

标签: c++ macos cmake

我一直在尝试用CMake包含不同类型的库。

  • .A
  • 名为.dylib
  • 的.so

我终于让.a.dylib同时使用此代码。

find_library(libname NAMES  libcef.dylib PATHS ${libname_PATH})

与此一起,在add_executable下面初始化构建的所有文件。

target_link_libraries(${PROJECT_NAME} ${libname})

但是,我尝试在.so文件上使用相同的代码,但它似乎不起作用。

我在尝试构建时从cmake获得此声明。

Target "project name" links to item

-- path of file -- 

which is a full-path but not a valid library file name.

我不确定这是否是处理.so文件的正确方法,或者我甚至不完全理解.so文件是什么。任何意见和/或澄清将非常感激。

编辑:

理论 - 我的理论是因为它在库名称前面没有lib,名为ffmpegsumo.so。但是,当我尝试重命名它时,文件名仍然保存到变量名称中非常奇怪。

2 个答案:

答案 0 :(得分:1)

同样适用于.so文件,只需确保所提供的${libname_PATH}所需的.so文件。

find_library以同样的方式处理所有类型(.a / .so / .dylib / .dll)。问题可能如下

- 路径未正确设置
- 因绝对路径而出错 - 。不存在
- 如果错误来自构建(不是来自仅配置),则.so可能已损坏,请尝试替换它

- 您的图书馆似乎无效

答案 1 :(得分:0)

共享库是动态链接的。这意味着在运行应用程序时,您的操作系统将自动查找并加载.so文件。您只需要告诉cmake库的名称,操作系统将负责其余的工作。

例如,如果要链接到libSDL.so的动态库,只需说:target_link_libraries(${PROJECT_NAME} SDL)

作为完整性检查,您的链接器将确保您的计算机上确实存在SDL库。这就是为什么如果该库在链接时不可用,可能会出现链接错误,即使它实际上是一个动态库。