2014-11-24 115 views
1

Qt Creator中(版本3.0.1,使用Qt 5.2.1版),我做了一個自定義cmake步驟(而不是qmake),具有以下CMakeLists.txt文件:Qt Creator中無法找到的cmake定製庫步

cmake_minimum_required (VERSION 2.8) 

add_executable (myapp source.cpp) 

target_link_libraries(myapp dl) 

在我source.cpp文件,我有以下代碼:

#include <dlfcn.h> 

int main() 
{ 
    dlopen("mylibrary.so", RTLD_NOW|RTLD_GLOBAL); 
    return 0; 
} 

而且mylibrary.so位於/usr/lib

當我從命令行使用cmakemake進行編譯時,它按預期編譯。但是,如果我嘗試Qt Creator中構建此,我收到以下錯誤:

undefined reference to `dlopen' 

這表明,Qt Creator的不知道去哪裏找找到libdl.so,這是/usr/lib/x86_64-linux-gnu

所以我的問題是:爲什麼從命令行運行cmakemake工作,而在Qt Creator中構建不起作用?我該如何告訴Qt Creator在哪裏搜索libdl.so

+0

其中Ar目標你在QtCreator中使用? – lpapp 2014-11-24 13:06:01

+0

順便說一句,cmake 2.8很舊。請升級。 – lpapp 2014-11-24 13:17:12

+0

您可以使用'CMAKE_DL_LIBS'變量。它是一個內置變量,可以保存dl庫的路徑。 http://www.cmake.org/cmake/help/v3.0/variable/CMAKE_DL_LIBS.html – jet47 2014-11-27 18:18:22

回答

0

首先,你應該在Qt軟件中使用QLibrary來處理動態加載,查找等等。你也可以省去你現在看到的麻煩。

其次,你可以用這個,但它是一個有點硬接線的事情,不可否認:

target_link_libraries(myapp /usr/lib/x86_64-linux-gnu/libdl.so) 

第三,更好的方法是使用一些Find模塊的具體步驟如下:

# - Find libdl 
# Find the native LIBDL includes and library 
# 
# LIBDL_INCLUDE_DIR - where to find dlfcn.h, etc. 
# LIBDL_LIBRARIES - List of libraries when using libdl. 
# LIBDL_FOUND - True if libdl found. 
IF (LIBDL_INCLUDE_DIR) 
# Already in cache, be silent 
SET(LIBDL_FIND_QUIETLY TRUE) 
ENDIF (LIBDL_INCLUDE_DIR) 
FIND_PATH(LIBDL_INCLUDE_DIR dlfcn.h) 
SET(LIBDL_NAMES dl libdl ltdl libltdl) 
FIND_LIBRARY(LIBDL_LIBRARY NAMES ${LIBDL_NAMES}) 
# handle the QUIETLY and REQUIRED arguments and set LIBDL_FOUND to TRUE if 
# all listed variables are TRUE 
INCLUDE(FindPackageHandleStandardArgs) 
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibDL DEFAULT_MSG LIBDL_LIBRARY LIBDL_INCLUDE_DIR) 
IF(LIBDL_FOUND) 
SET(LIBDL_LIBRARIES ${LIBDL_LIBRARY}) 
ELSE(LIBDL_FOUND) 
SET(LIBDL_LIBRARIES) 
ENDIF(LIBDL_FOUND) 
MARK_AS_ADVANCED(LIBDL_LIBRARY LIBDL_INCLUDE_DIR) 

,然後你可以找到如下因爲你擁有了它在你的cmake模塊路徑:

find_package(LIBDL REQUIRED) 
+0

QLibrary是解決這個問題的唯一方法嗎?或者只是推薦的方式? – Karnivaurus 2014-12-04 18:12:00

+0

@Karnivaurus:我會推薦的;如果沒有,那就是find_package(LIBDL REQUIRED)方法。但只要你對他們感到滿意,每一種方式都有效。除非需要我花太多時間重寫,否則我會成爲QLibrary的最高興者。 – lpapp 2014-12-04 18:24:37

+0

@Karnivaurus:沒有選擇答案的任何原因? – lpapp 2014-12-11 05:32:03