首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Cmake target_link_libraries未链接我的库

Cmake target_link_libraries未链接我的库
EN

Stack Overflow用户
提问于 2011-03-23 01:44:04
回答 2查看 57.2K关注 0票数 21

我要说的是,我在Cmake matter上几乎完全是个哑巴。

我为Kdede4.1项目提供了以下CMakeLists.txt

代码语言:javascript
复制
project(uart)

find_package(KDE4 REQUIRED)
include (KDE4Defaults)

include_directories( ${KDE4_INCLUDES} ${QT_INCLUDES} src/include src/include/QSerialDevce )

add_subdirectory(doc)
add_subdirectory(src)
add_subdirectory(icons)

link_directories(/usr/lib)

find_library(SERIALDEVICE_LIB qserialdeviced)

add_executable(uart ${uart_SRCS})
target_link_libraries(uart ${SERIALDEVICE_LIB})

当我尝试构建我的项目时,我看到:

代码语言:javascript
复制
uart/build> make -j2
-- Found Qt-Version 4.6.3 (using /usr/bin/qmake-qt4)
-- Found X11: /usr/lib64/libX11.so
-- Found KDE 4.5 include dir: /usr/include/kde4
-- Found KDE 4.5 library dir: /usr/lib64/kde4/devel
-- Found the KDE4 kconfig_compiler4 preprocessor: /usr/bin/kconfig_compiler4
-- Found automoc4: /usr/bin/automoc4
CMake Error at CMakeLists.txt:16 (add_executable):
  add_executable called with incorrect number of arguments


CMake Error: Attempt to add link library "/usr/lib/libqserialdeviced.so" to target "uart" which is not built by this project.
-- Configuring incomplete, errors occurred!
make: *** [cmake_check_build_system] Error 1
*** Failed ***

我读到的所有内容都说add_executabletarget_link_libraries应该看起来像我文件的最后两行:

代码语言:javascript
复制
add_executable(uart ${uart_SRCS})
target_link_libraries(uart ${SERIALDEVICE_LIB})

如果我更改CMakeLists.txt的这两行代码,将其保留为:

代码语言:javascript
复制
project(uart)

find_package(KDE4 REQUIRED)
include (KDE4Defaults)

include_directories( ${KDE4_INCLUDES} ${QT_INCLUDES} src/include src/include/QSerialDevce )

add_subdirectory(doc)
add_subdirectory(src)
add_subdirectory(icons)

link_directories(/usr/lib)

find_library(SERIALDEVICE_LIB qserialdeviced)

target_link_libraries(${SERIALDEVICE_LIB})

我明白了:

代码语言:javascript
复制
uart/build> make -j2
-- Found Qt-Version 4.6.3 (using /usr/bin/qmake-qt4)
-- Found X11: /usr/lib64/libX11.so
-- Found KDE 4.5 include dir: /usr/include/kde4
-- Found KDE 4.5 library dir: /usr/lib64/kde4/devel
-- Found the KDE4 kconfig_compiler4 preprocessor: /usr/bin/kconfig_compiler4
-- Found automoc4: /usr/bin/automoc4
-- Configuring done
-- Generating done
-- Build files have been written to: uart/build
[ 11%] Built target doc-handbook
[ 11%] Built target uart_automoc
Linking CXX executable uart
CMakeFiles/uart.dir/uart.o: In function `uart::setupSerial()':
uart/src/uart.cpp:126: undefined reference to `AbstractSerial::AbstractSerial(QObject*)'
CMakeFiles/uart.dir/uart.o: In function `uart::setupEnumerator()':
uart/src/uart.cpp:108: undefined reference to `SerialDeviceEnumerator::SerialDeviceEnumerator(QObject*)'
CMakeFiles/uart.dir/uart.o: In function `uart::setupSerial()':
uart_/uart/src/uart.cpp:136: undefined reference to `AbstractSerial::enableEmitStatus(bool)'
CMakeFiles/uart.dir/uart.o: In function `uart::setupEnumerator()':
uart_/uart/src/uart.cpp:112: undefined reference to `SerialDeviceEnumerator::setEnabled(bool)'
collect2: ld returned 1 exit status
make[2]: *** [src/uart] Error 1
make[1]: *** [src/CMakeFiles/uart.dir/all] Error 2
make: *** [all] Error 2
*** Failed ***

这清楚地表明target_link_libraries没有链接我的qserialdeviced

qserialdeviced/usr/lib/libqserialdeviced.so.1.0.0,正确地链接到/usr/lib/libqserialdeviced.so,如果我手动将其添加到Makefile中,很容易找到它。

显然我试过了:

代码语言:javascript
复制
target_link_libraries(-lqserialdeviced)

没有变化。

我也试过了:

代码语言:javascript
复制
if ("${SERIALDEVICE_LIB}" STREQUAL "SERIALDEVICE_LIB-NOTFOUND")
    message(FATAL_ERROR "'qserialdeviced' wasn't found!")
else()
    message("'qserialdeviced' found: " ${SERIALDEVICE_LIB})
endif ()

但是这个测试是成功的。找到该库:

代码语言:javascript
复制
'qserialdeviced' found: /usr/lib/libqserialdeviced.so

有人能帮我理解一下这里发生了什么吗?

我使用的是Linux Fedora 13,cmake版本2.8.0,gcc (GCC) 4.4.5 20101112 (Red Hat 4.4.5-2)和kdevelop 4.1.0-1.fc13.x86_64。

谢谢,我提前来了。

编辑:

根据@DatChu的建议,我将我的CMakeLists.txt拆分到我的子目录中,现在一切对我来说都有意义了。

谢谢大家!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-23 01:52:32

对于原始CMakeLists.txt文件,问题不在于target_link_libraries,而在于add_executable

代码语言:javascript
复制
add_executable(uart ${uart_SRCS})

您在哪里设置了uart_SRCS变量?你有没有

代码语言:javascript
复制
set(uart_SRCS src/blahblah.cpp src/somethingblahblah.cpp)

我想你可能误解了add_subdirectory是做什么的。它不会添加内部的源文件。它告诉CMake进入那个文件夹并寻找另一个CMakeLists.txt。通常,当项目文件夹中有一个子项目时,可以使用它。

如果您有许多不想手动设置的源文件,您也可以这样做

代码语言:javascript
复制
file(GLOB uart_SRCS src/*.cpp src/*.c)

缺点是您需要手动重新运行CMake,以便它能够检测新文件。请参阅Jack关于为什么这可能不是您想要使用的内容的评论。

您的CMakeLists.txt很可能是

代码语言:javascript
复制
project(uart)

find_package(Qt4 REQUIRED)
include (${QT_USE_FILE})
find_package(KDE4 REQUIRED)
include (KDE4Defaults)

include_directories( ${KDE4_INCLUDES} ${QT_INCLUDES} src/include src/include/QSerialDevice )
link_directories(/usr/lib) 

file(GLOB uart_SRCS src/*.cpp src/*.h)
file(GLOB uart_HDRS include/*.h include/QSerialDevice/*.h)

find_library(SERIALDEVICE_LIB qserialdeviced)

add_executable(uart ${uart_SRCS} ${uart_HDRS})
target_link_libraries(uart ${SERIALDEVICE_LIB} ${QT_LIBRARIES})
票数 15
EN

Stack Overflow用户

发布于 2021-03-17 23:28:23

这并不是一个真正直接的解决方案,但是我在“未定义的引用”错误中遇到了这样的困难(以前是通过链接适当的库来解决的,但不是在这个例子中),直到我发现了一些东西--不知何故与c和cpp不兼容。定义这些引用函数的文件在.c文件中(这将默认使用C编译器编译cmake )。我引用这些函数的文件是一个.cpp文件(使用g++编译器或您的c++编译器环境)。一旦我将.c文件更改为.cpp,“未定义的引用”错误就消失了。上面看起来您的uart文件是.cpp,但是可以检查一下其他文件是什么,然后尝试这个方法。这可能不是合适的解决方案,甚至根本不是,但这可能会让你度过一天并继续前进。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5395578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档