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

Dav*_*d Z 74 cmake static-libraries

我有一个带有Makefile的小项目,我试图转换为CMake,主要是为了获得CMake的经验.出于此示例的目的,项目包含一个源文件(C++,虽然我认为该语言不是特别相关)和一个我从其他地方复制过的静态库文件.为了论证,假设库的源代码不可用; 我只有.a文件和相应的标题.

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

main: main.o libbingitup.a
    g++ -o main main.o libbingitup.a
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.我如何告诉CMake重现这个?当然,这不是字面上的精确makefile,而是包含等效链接命令的东西.我尝试过明显但天真的方式,比如

add_executable(main main.cpp libbingitup.a)
Run Code Online (Sandbox Code Playgroud)

要么

add_executable(main main.cpp)
target_link_libraries(main libbingitup.a)
Run Code Online (Sandbox Code Playgroud)

以及与各种事物link_directories(.)add_library(bingitup STATIC IMPORTED)等,但没有到目前为止,结果在一个成功的连锁.我该怎么办?


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

Fra*_*ser 103

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

add_executable(main main.cpp)
target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a)
Run Code Online (Sandbox Code Playgroud)

  • 我同意这里看起来有些过分,但是如果你安装了同一个lib的多个不同版本,那么明确指定完整路径会带来好处. (3认同)
  • 您需要使用[`target_include_directories`](https://cmake.org/cmake/help/v3.5/command/target_include_directories.html)或[`include_directories`](https://cmake.org/cmake /help/v3.5/command/include_directories.html)(前者是首选方式,因为它更具体). (3认同)
  • 太好了,有效,谢谢!必须在这里明确输入完整路径似乎有点hackish,但我想这只是CMake的方式...... (2认同)
  • main 如何知道包含目录? (2认同)

Cri*_*ngo 22

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

add_executable(main main.cpp)
target_link_libraries(main bingitup)
Run Code Online (Sandbox Code Playgroud)

bingitup 如果在CMake项目中创建静态库,则为目标提供相同的名称:

add_library(bingitup STATIC bingitup.cpp)
Run Code Online (Sandbox Code Playgroud)

CMake会自动在Linux上添加lib和添加.a到前端,.lib最后在Windows上添加.

如果库是外部的,您可能希望使用添加库的路径

link_directories(/path/to/libraries/)
Run Code Online (Sandbox Code Playgroud)

  • @乔治:你不能。如果两种类型都存在,请包含要链接的文件的全名。 (4认同)
  • 如果存在同名的 .a 和 .so 文件,在这种情况下您如何指定要链接到 .a 或 .so? (2认同)

stu*_*stu 20

我觉得这很有帮助......

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)
Run Code Online (Sandbox Code Playgroud)

  • INCLUDE_DIRECTORIES 怎么样? (3认同)