如何告诉CMake链接源目录中的静态库?


95

我有一个带有Makefile的小项目,我正尝试将其转换为CMake,主要是为了获得CMake的经验。就本示例而言,项目包含一个源文件(C ++,尽管我认为该语言不是特别重要)和一个静态库文件,该文件是我从其他地方复制来的。出于争论的考虑,假设该库的源代码不可用;我只有.a文件和相应的标头。

我手工制作的Makefile包含以下构建规则:

main: main.o libbingitup.a
    g++ -o main main.o libbingitup.a

效果很好。我如何告诉CMake重现此内容?当然,从字面上看,并不是确切的makefile,而是包含等效链接命令的东西。我尝试了一些明显但天真的方法,例如

add_executable(main main.cpp libbingitup.a)

要么

add_executable(main main.cpp)
target_link_libraries(main libbingitup.a)

以及带有link_directories(.)add_library(bingitup STATIC IMPORTED)等等的各种事物,但到目前为止,没有任何事物能够成功实现链接。我该怎么办?


版本详细信息:具有GCC 4.6.3的Linux(Kubuntu 12.04)上的CMake 2.8.7

Answers:


121

CMake赞成将完整路径传递给链接库,因此假设libbingitup.a在中${CMAKE_SOURCE_DIR},则执行以下操作应该成功:

add_executable(main main.cpp)
target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a)

2
很好,行得通,谢谢!似乎必须在这里明确地输入完整路径似乎有些,但我想那只是CMake的方式……
David Z

4
我同意这似乎有些矫kill过正,但是如果您安装了同一库的多个不同版本,则明确指定完整路径会带来好处。
弗雷泽,

1
像往常一样惊人!在我的情况下,解决了依赖于另一个依赖于静态库的内置动态库的库问题:依赖库也在尝试链接到该静态库。
Antonio

1
主要如何了解包含目录?
ManuelSchneid3r

3
您需要使用target_include_directoriesinclude_directories(前者是首选方式,因为它更具体)。
Fraser

31

如果您不想包含完整路径,则可以执行

add_executable(main main.cpp)
target_link_libraries(main bingitup)

bingitup 如果在CMake项目中创建静态库,则为您指定的目标名称是相同的:

add_library(bingitup STATIC bingitup.cpp)

CMake的自动添加lib到前面,.a在Linux上的结束,以及.lib在Windows上的结束。

如果库是外部库,则可能要使用以下命令将路径添加到库

link_directories(/path/to/libraries/)

1
并且,如果有.a和.so文件以您指定的相同名称命名,那么您想在这种情况下链接到.a或.so吗?
乔治

1
@乔治:你不能。如果同时存在两种类型,请包括要链接的文件的全名。
克里斯·伦戈

21

我发现这很有帮助...

http://www.cmake.org/pipermail/cmake/2011-June/045222.html

从他们的例子:

ADD_LIBRARY(boost_unit_test_framework STATIC IMPORTED)
SET_TARGET_PROPERTIES(boost_unit_test_framework PROPERTIES IMPORTED_LOCATION /usr/lib/libboost_unit_test_framework.a)
TARGET_LINK_LIBRARIES(mytarget A boost_unit_test_framework C)

3
那INCLUDE_DIRECTORIES呢?
kyb

1
仅当库是cmake构建的一部分时,此方法才有效,但对于国外库,则不起作用
eigenfield

问题是:“该项目包含一个源文件(C ++,尽管我认为该语言不是特别重要)和一个静态库文件,该文件已从其他地方复制”。
stu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.