2014-11-24 47 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