C++ 包括使用CMake的共享库(.so)

C++ 包括使用CMake的共享库(.so),c++,macos,cmake,C++,Macos,Cmake,我一直在尝试使用CMake包含不同类型的库 .a 迪利布先生 .那么 最后,我得到了.a和.dylib来处理这段代码 find_library(libname NAMES libcef.dylib PATHS ${libname_PATH}) 除此之外,在下面,我将添加可执行文件,以便为构建初始化所有文件 target_link_libraries(${PROJECT_NAME} ${libname}) 但是,我尝试在文件上使用相同的代码,所以文件似乎不起作用 当我尝试构建时,我从cm

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

  • .a
  • 迪利布先生
  • .那么
最后,我得到了
.a
.dylib
来处理这段代码

find_library(libname NAMES  libcef.dylib PATHS ${libname_PATH})
除此之外,在下面,我将添加可执行文件,以便为构建初始化所有文件

target_link_libraries(${PROJECT_NAME} ${libname})
但是,我尝试在
文件上使用相同的代码,所以
文件似乎不起作用

当我尝试构建时,我从cmake得到了这个声明

Target "project name" links to item

-- path of file -- 

which is a full-path but not a valid library file name.
我不确定这是否是处理
.so
文件的正确方法,或者我甚至不完全理解
.so
文件是什么。如有任何意见和/或澄清,将不胜感激

编辑:


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

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

例如,如果要链接到libSDL.so的动态库,只需说:
target\u link\u libraries(${PROJECT\u NAME}SDL)


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

同样的情况也应该适用于.so文件。因此,只需确保所需的.so文件存在于您给定的
${libname\u PATH}

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

--路径设置不正确
--绝对路径导致的错误
--.因此不存在
--如果错误来自生成(而不仅仅来自配置)。因此可能已损坏,请尝试替换它


--您的库似乎无效

我认为这行不通。通常,如果我错了,请纠正我,但它会检查MAC目录中某些位置的库文件
usr/lib/
etc然而,我在构建文件中提供了.so链接。运输署;我想我必须以某种方式静态链接到库。不过我已经试过你的建议了!对于xcode中的“未找到库”,您必须提供一个.so文件来链接,以便链接器确信您正在链接到一个真正的库,但当您启动程序时,它将在运行时再次查找该库。静态链接可能更简单。静态链接和动态链接都使用相同形式的
target\u link\u库
您必须提供一个.so文件来链接,以便链接器确信您正在链接到一个真正的库
,这正是我遇到的问题。并同意使用
target\u link\u libraries
@progenhard加载不在默认路径中的动态库,您需要设置一个特殊指令来说明这一点。不确定这在xcode中是否相同,但在linux中,您需要将Environment指令
LD_LIBRARY\u PATH
设置为指向库所在的目录。我想在xcode中,您需要设置
DYLD\u LIBRARY\u路径
,如果您还没有到这里,这可能会派上用场:这很奇怪,我相信我得到了正确的路径,因为我实际上从我提供的同一路径提取了.a库和.dylib库,并且它正在正确地找到它们。然而,我的理论是因为它在名为
ffmpegsumo的库名称前面没有lib