CMake到外部库的链接
如何让CMake将可执行文件链接到不在同一CMake项目中生成的外部共享库 只需执行CMake到外部库的链接,cmake,Cmake,如何让CMake将可执行文件链接到不在同一CMake项目中生成的外部共享库 只需执行target\u link\u库(GLBall${CMAKE\u BINARY\u DIR}/res/mylib.so)就会产生错误 make[2]: *** No rule to make target `res/mylib.so', needed by `GLBall'. Stop. make[1]: *** [CMakeFiles/GLBall.dir/all] Error 2 make: *** [al
target\u link\u库(GLBall${CMAKE\u BINARY\u DIR}/res/mylib.so)
就会产生错误
make[2]: *** No rule to make target `res/mylib.so', needed by `GLBall'. Stop.
make[1]: *** [CMakeFiles/GLBall.dir/all] Error 2
make: *** [all] Error 2
(GLBall is the executable)
在我将库复制到二进制目录bin/res
之后
我尝试使用find_库(结果mylib.so路径${CMAKE_BINARY_DIR}/res)
如果
RESULT-NOTFOUND
,首先设置库搜索路径,则失败:
LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/res)
然后就这么做
TARGET_LINK_LIBRARIES(GLBall mylib)
arrowdodger的回答是正确的,在很多情况下都是首选。我只想在他的回答之外再加上一条: 您可以添加“导入的”库目标,而不是链接目录。比如:
# Your-external "mylib", add GLOBAL if the imported library is located in directories above the current.
add_library( mylib SHARED IMPORTED )
# You can define two import-locations: one for debug and one for release.
set_target_properties( mylib PROPERTIES IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/res/mylib.so )
然后链接,就像此库是由您的项目构建的一样:
TARGET_LINK_LIBRARIES(GLBall mylib)
这样的方法会给您更多的灵活性:看看命令和命令
我不知道这是否能解决“更新版本的libs”的问题。如果您正在使用Appstore,则需要“授权”,因此需要与Apple框架链接 要获得工作授权(例如GameCenter),您需要有一个“链接二进制文件与库”-buildstep,然后链接到“GameKit.framework”。CMake将“低级”库“注入”到命令行中,因此Xcode并不真正了解它,因此您不会在功能屏幕中启用GameKit 使用CMake并拥有“与二进制文件的链接”的一种方法——构建步骤是使用CMake生成xcodeproj,然后使用“sed”来“搜索和替换”,并以XCode喜欢的方式添加游戏套件 脚本如下所示(对于Xcode 6.3.1) 将其保存到“gamecenter.sed”,然后像这样“应用”它(它会更改您的xcodeproj!) 您可能需要更改脚本命令以满足需要 警告:由于项目格式可能发生变化,它可能会与不同的Xcode版本中断,(硬编码的)唯一编号可能不是唯一的-通常其他人的解决方案更好-因此,除非您需要支持Appstore+授权(和自动构建),否则不要这样做
这是一个CMake bug,请参见和我假设您想链接到一个名为foo的库,它的文件名通常是link
foo.dll
或libfoo.so
1。查找库你必须找到图书馆。这是一个好主意,即使你知道去图书馆的路。如果库消失或获得新名称,则CMake将出错。这有助于及早发现错误,并让用户(可能自己)清楚问题的原因。
要查找库foo并将路径存储在
foo_LIB
中,请使用
find_library(FOO_LIB foo)
CMake将自行确定实际的文件名。它检查通常的位置,如/usr/lib
,/usr/lib64
和路径中的路径
您已经知道库的位置。当您调用CMAKE时,将其添加到CMAKE\u PREFIX\u路径
,那么CMAKE也会在传递的路径中查找您的库
有时需要添加提示或路径后缀,有关详细信息,请参阅文档:
2。链接库
从1。您在FOO_LIB
中有完整的库名。您可以使用它将库链接到目标GLBall
,如中所示
target_link_libraries(GLBall PRIVATE "${FOO_LIB}")
您应该在目标后添加PRIVATE
、PUBLIC
或INTERFACE
,参见文档:
如果不添加这些可见性说明符中的任何一个,它的行为将类似于PRIVATE
或PUBLIC
,具体取决于CMake版本和策略集
3。添加包含项(此步骤可能不是强制性的)。
如果还希望包含头文件,请使用类似于查找库
的查找路径
并搜索头文件。然后添加带有target\u include\u目录的include目录
,类似于target\u link\u库
文件:
和
如果可用于外部软件,您可以将查找库
和查找路径
替换为查找包
假设您有如下可执行文件:
add_executable(GLBall GLBall.cpp)
如果外部库具有标题,请提供其包含文件夹的路径:
target_include_directories(GLBall PUBLIC "/path/to/include")
添加库目录路径:
target_link_directories(GLBall PUBLIC "/path/to/lib/directory")
最后,链接库名称
target_link_libraries(GLBall mylib)
请注意,库文件的前缀和扩展名将被删除:
libmylib.a➜ mylib
迈里布·索➜ mylib可能是add\u库(mylib共享导入)
或者您得到一个用导入的参数调用的add\u库,但没有库类型
error@Andre:我认为在IMPORTED\u LOCATION
之后,开始括号是错误的。如果要访问当前add\u库上方目录中的导入库,需要在IMPORTED
之后添加GLOBAL
(breakpad静态导入全局)
@SOUser:是的,导入的位置应该指向文件,而不是目录。我已经解决了这个问题,我想作者不会抱怨的。我真的不知道为什么Official不支持这些基本用法!感谢不鼓励使用,即使在它自己的文档中也是如此。我认为在这里解决失败的find\u libr会更好ary
调用原始问题,或使用@Andre的解决方案。我发现“导入”library target更加健壮,因为它以特定库的位置为目标,而不是简单地给出一个全局搜索路径。请参见Andre的答案。您应该始终使用find_library
,并使用此路径,而不是硬编码,参见。具体而言,让cmake与外部库链接不是问题(上面有几种解决方案)。以自动化的方式实现这一点,使其与苹果Appstore和授权一起工作是一个挑战
target_link_directories(GLBall PUBLIC "/path/to/lib/directory")
target_link_libraries(GLBall mylib)