2014-12-05 109 views
3

我有以下的项目文件结构:CMake的链接库(.A /的.so)

libs/ 
    └──FreeImage/ 
     ├── FreeImage.dll 
     ├── FreeImage.h 
     ├── FreeImage.lib 
     ├── license-fi.txt 
     ├── license-gplv2.txt 
     └── license-gplv3.txt 
main.cpp 
CMakeLists.txt 

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.4) 
project(untitled) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

set(FREEIMAGE_LIBRARY_AND_HEADER_DIRECTORY libs/FreeImage) 
find_path(FREEIMAGE_LIBRARY_AND_HEADER_DIRECTORY FreeImage.h) 
find_library(FREEIMAGE_LIBRARY_AND_HEADER_DIRECTORY freeimage) 
include_directories(${FREEIMAGE_LIBRARY_AND_HEADER_DIRECTORY}) 

set(SOURCE_FILES main.cpp) 
add_executable(main ${SOURCE_FILES}) 

target_link_libraries(main freeimage) 

我跟着this写我CMakeLists.txt,但它不适合我。

输出:

/home/username/main_ssd/soft/linux/portable/clion-140.569.17/bin/cmake/bin/cmake --build /home/username/.clion10/system/cmake/generated/70336599/70336599/Debug --target main -- -j 4 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /home/username/.clion10/system/cmake/generated/70336599/70336599/Debug 
Scanning dependencies of target main 
[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o 
Linking CXX executable main 
/usr/bin/ld: cannot find -lfreeimage 
collect2: error: ld returned 1 exit status 
CMakeFiles/main.dir/build.make:85: recipe for target 'main' failed 
make[3]: *** [main] Error 1 
CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/main.dir/all' failed 
make[2]: *** [CMakeFiles/main.dir/all] Error 2 
CMakeFiles/Makefile2:72: recipe for target 'CMakeFiles/main.dir/rule' failed 
make[1]: *** [CMakeFiles/main.dir/rule] Error 2 
Makefile:160: recipe for target 'main' failed 
make: *** [main] Error 2 
+0

在旁注“dirrectory”拼写“目录” – remram 2014-12-07 07:21:42

+0

谢谢!我在代码中修复了它。 – 2014-12-07 18:38:32

回答

1

我已经下载的FreeImage库的新版本(从here),并编制遵循这些说明:

Compiling FreeImagePlus 
----------------------- 
FreeImagePlus is a C++ wrapper for FreeImage. 
To compile FreeImage as a C++ library, follow these steps : 
1) Enter the FreeImage directory 
2) Build the distribution : 
make -f Makefile.fip 
make -f Makefile.fip install 
3) Clean all files produced during the build process 
make -f Makefile.fip clean 

所以我已经得到了库的以下文件结构:

libs/FreeImage/ 
├── FreeImage.h 
├── FreeImagePlus.h 
├── libfreeimageplus-3.16.0.so 
├── libfreeimageplus.a 
├── license-fi.txt 
├── license-gplv2.txt 
└── license-gplv3.txt 

然后我修改我的CMakeLists.txt所示:

cmake_minimum_required(VERSION 2.8.4) 
project(untitled) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

find_path(SIFTGPU_INCLUDE_DIR FreeImage.h) 
find_library(SIFTGPU_LIBRARY libfreeimageplus) 
include_directories(${SIFTGPU_INCLUDE_DIR}) 

add_executable(main ${SOURCE_FILES}) 

target_link_libraries(main freeimageplus) 
2

set(FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY libs/FreeImage)

变量FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY设置为libs/FreeImage

find_path(FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY FreeImage.h)

变量FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY设置为directory含有指定的文件FreeImage.h。没有提示这些命令存在时,因为丢失可选参数路径或HINTS

find_library(FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY freeimage) 变量FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY被设定为full path到库FreeImage(如果找到)。没有提示,命令都存在,因为缺少可选参数路径或提示

include_directories(${FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY})

可变FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY包含(如果找到),完整路径库FreeImage

target_link_libraries(main freeimage)

没有目标与名freeimage存在于的CMakeLists.txt,因此就认为要链接-lfreeimage

问:为什么你试图在Linux上使用“DLL”?

+0

我认为这是可能的。现在我找到了这个lib的更新版本,并找到.so和.a库。 – 2014-12-05 10:13:12

0

彼得您指向正确的方向:

target_link_libraries(main freeimage) 

应改为:

target_link_libraries(main ${freeimage}) 

其中${freeimage}是包含要链接到与检索的库的路径值的变量find_library

希望它有帮助。