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

时间:2012-12-29 00:44:24

标签: cmake static-libraries

我有一个带有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

4 个答案:

答案 0 :(得分:88)

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

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

答案 1 :(得分:15)

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

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)

答案 2 :(得分:15)

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

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/)

答案 3 :(得分:-1)

我想添加到其他评论中,项目名称是第一个参数。我有一个叫cmakecompile的项目,我想在里面添加libusb,代码如下,

add_executable(cmakecompile main.c)
target_link_libraries(cmakecompile "D:/msys2/mingw64/lib/libusb-1.0.a")

该项目只有一个 main.c 文件,target_link_libraries 中的第一个参数是项目名称,第二个参数是库的路径

注意可能有帮助:由于我在 windows 下编译,我必须安装 msys2,因为您拥有的库必须使用相同的编译器编译。例如,如果您获得 libusb 并尝试在 qt-creator 项目中使用它,它将不起作用并且您可能会获得未引用的函数,因此我必须安装 msys2 并从 msys2 内部安装 libusb,安装 make 并创建一个 QT Cmake 项目并使用 msys2 make 从 Qt creator 编译。

完整的 cmakelists.txt 如下

cmake_minimum_required(VERSION 3.5)

project(cmakecompile LANGUAGES C)

add_executable(cmakecompile main.c)
target_link_libraries(cmakecompile "D:/msys2/mingw64/lib/libusb-1.0.a")