CMake:如何链接静态第三方库?

5

我的现有资料包括:我的代码(简单的main.cpp),第三方库EnvVar的头文件(TPLIB_INCLUDE),二进制库(位于TPLIB_BINARY_PATH中的若干.a文件)以及以下CMakeLists.txt:

# current source directory: CMAKE_CURRENT_SOURCE_DIR
# current binary directory: CMAKE_CURRENT_BINARY_DIR

# require 2.6 to get support for the simple IF construct
CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0)

PROJECT( simpleapp)
SET( PROGNAME simpleapp )

SET( CMAKE_COLOR_MAKEFILE ON )
SET( CMAKE_VERBOSE_MAKEFILE ON )
SET( CMAKE_INCLUDE_CURRENT_DIR TRUE )

# the actual .cpp files go here
SET(project_SOURCES
    main.cpp
)

# add here all files that need processing by Qt's MOC if there are any
set(project_MOC_SOURCES
    # files would go here
)

# add here all files that will be processed by Qt's UIC
set(project_UIS
    # all .ui files would go here
)

# additional Qt resources go here
set(project_RCCS
    # all .qrc files would go here
)

# setup Qt
FIND_PACKAGE(Qt4 REQUIRED)

INCLUDE(${QT_USE_FILE})

QT4_WRAP_CPP(test_MOCS ${project_MOC_SOURCES})
QT4_WRAP_UI(test_UIS_H ${project_UIS})
QT4_WRAP_CPP(test_MOC_UI ${project_UIS_H})
QT4_ADD_RESOURCES(test_RCC_SRCS ${project_RCCS})

include_directories( ${CMAKE_BINARY_DIR} $ENV{TPLIB_INCLUDE})

ADD_EXECUTABLE( ${PROGNAME} ${project_SOURCES} ${test_MOCS} ${test_RCC_SRCS} ${test_MOC_UI} )

link_directories($ENV{TPLIB_BINARY_PATH})

TARGET_LINK_LIBRARIES(${PROGNAME} ${QT_LIBRARIES} lib_misc lib_tools)

make工程创建main.cpp.o一切正常。这样CMake就可以找到第三方头文件了。但是在链接时,ld会抱怨找不到-llib_misc和-llib_tools。

删除"link_directories"行或指定库的绝对名称会导致"No rule to make target /path/to/lib_misc.a"。

那么如何告诉CMake只使用这些库进行链接呢?

1个回答

9

link_directories($ENV{TPLIB_BINARY_PATH})应该放在ADD_EXECUTABLE之前。

根据CMake官方文档link_directories的说明

该命令只适用于在其后创建的目标。


3
或者完全避免使用link_directories,而是在target_link_libraries参数列表中使用库文件的完整路径名:“target_link_libraries(${PROGNAME} ${QT_LIBRARIES} $ENV{TPLIB_BINARY_PATH}/liblib_misc.a $ENV{TPLIB_BINARY_PATH}/liblib_tools.a)”如果实际文件名为“lib_misc.a”,那么如果您在add_executable之前使用link_directories,则只需要传递“_misc”给target_link_libraries即可... - DLRdave
“this”是什么意思?使用完整路径名还是使用短名称?这两种方法在CMake 2.8.9中都应该有效。如果不行,那么你可能有一个拼写错误或者存在一个bug……应该在CMake邮件列表中提供具体的重现问题的步骤。那里的人可以帮助你找到拼写错误或解决问题。 - DLRdave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接