簡體   English   中英

Cmake target_link_libraries 沒有鏈接我的庫

[英]Cmake target_link_libraries not linking my library

我將開始聲明我在 Cmake 問題上幾乎是完全愚蠢的。

對於 Kdevelop 4.1 項目,我有以下CMakeLists.txt

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

當我嘗試構建我的項目時,我看到:

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應該看起來像我文件的最后兩行:

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

如果我更改CMakeLists.txt的這兩行,將其保留為:

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

我懂了:

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 中很容易找到。

我顯然嘗試過:

target_link_libraries(-lqserialdeviced)

沒有變化。

我也試過:

if ("${SERIALDEVICE_LIB}" STREQUAL "SERIALDEVICE_LIB-NOTFOUND")
    message(FATAL_ERROR "'qserialdeviced' wasn't found!")
else()
    message("'qserialdeviced' found: " ${SERIALDEVICE_LIB})
endif ()

但是這個測試成功了。 發現圖書館:

'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拆分到我的子目錄中,現在一切對我來說都有意義了。

謝謝大家!

對於原始 CMakeLists.txt 文件,問題不在於 target_link_libraries,而在於 add_executable

add_executable(uart ${uart_SRCS})

你在哪里設置你的 uart_SRCS 變量? 你有沒有

set(uart_SRCS src/blahblah.cpp src/somethingblahblah.cpp)

我認為您可能誤解了 add_subdirectory 的作用。 它不會在里面添加源文件。 它告訴 CMake 進入該文件夾並尋找另一個 CMakeLists.txt。 當您的項目文件夾中有一個子項目時,您通常會使用它。

如果您有許多不想手動設置的源文件,您也可以這樣做

file(GLOB uart_SRCS src/*.cpp src/*.c)

缺點是您需要手動重新運行 CMake 才能檢測新文件。 請參閱傑克關於為什么這可能不是您想要使用的內容的評論。

您的 CMakeLists.txt 很可能是

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

這不是一個真正的直接解決方案,但我在處理“未定義引用”錯誤時遇到了這樣的困難(之前通過鏈接適當的庫解決,但在這種情況下不是),直到我發現了一些東西 - 以某種方式與 c vs cpp 不兼容. 定義這些參考函數的文件是 in.c 文件(默認情況下 cmake 使用 C 編譯器進行編譯。)而我引用這些函數的文件是 a.cpp 文件(使用 g++ 編譯器或任何你的環境 c++ 編譯器)。 一旦我將.c 文件更改為.cpp,“未定義引用”錯誤就消失了。 在上面它看起來像你的 uart 文件是.cpp,但也許檢查其他文件是什么並嘗試這個方法。 它可能不是合適的解決方案,甚至根本不是一個解決方案,但這可能會讓您度過這一天並繼續前進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM