使用用户定义的共享库CMAKE LINKING ERROR

时间:2014-05-22 15:26:09

标签: c++ cmake

我是cmake世界的新手。当我在C ++中尝试一些基本的cmake配置时,出现了这个问题。确切地说,以下是我的目录结构:

/ SRC ----

 |-> CMakeLists.txt
   |-> main.cpp
   |-> lib----
              |-> libfsystem.so
   |->filesystem----
                    |->CMakeLists.txt
                    |->listfiles.cpp
                    |->include-----
                                   |->fsystem.h

现在,/ src / filesystem / CMakeLists.txt文件就像这样

cmake_minimum_required(VERSION 2.8)
project(fsystem)
set(CMAKE_BUILD_TYPE Release)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/build)
find_package(Boost REQUIRED system filesystem)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../lib)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
add_library(fsystem SHARED listfiles.cpp)

虽然/src/CMakeLists.txt文件是这样的

cmake_minimum_required(VERSION 2.8)

project(vessel_detect)

add_subdirectory(filesystem)

add_executable(main main.cpp)

set(CMAKE_LIBRARY_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib)
find_library(libpath fsystem)
MESSAGE(${libpath})
target_link_libraries(main ${libpath})
  1. 已成功创建库libfsystem.so。
  2. /src/CMakeLists.txt也成功找到了库libfsystem.so
  3. 然而,当完成main.cpp的链接时,它会给我几个未定义的引用错误,这些错误不应该发生,因为已经定义了所有内容。为了更完整,以下是main.cpp文件的内容

    Main.cpp的

    #include<iostream>
    #include"filesystem/include/fsystem.h"
    using namespace std;
    int main(void)
    {
            string path ("~");
            vector<string>* output;
            output = listfiles(path);
            return 0;
    }
    

    listfiles.cpp的内容是

    listfiles.cpp

    #include"fsystem.h"
    using namespace boost::filesystem;
    vector<string>* listfiles(int argc, char* argv[])
    {
             if (argc<2)
            {
                    std::cout<<"No file name provided"<<std::endl;
            }
            else
            {
                    path p(argv[1]);
                    vector<string>* output;
                    if (exists(p))
                    {
                            if(is_directory(p))
                            {
                                    std::cout<<"You specified a directory"<<std::endl;
                                    std::cout<<"Its contents are as follows :-"<<std::endl;
                                    typedef std::vector<path> vec;
                                    vec v;
                                    copy(directory_iterator(p),directory_iterator(),back_inserter(v));
                                    sort(v.begin(),v.end());
                                    for(vec::const_iterator it(v.begin());it!=v.end();++it)
                                              output->push_back(it->filename().string());
    //                                        std::cout<<it->filename()<<std::endl;
                            }
                            else if (is_regular_file(p))
                                    {
                                            std::cout<<argv[1]<<"   "<<file_size(p)<<std::endl;
                                    }
                                    else
                                    {
                                            std::cout<<"The file is neither a directory nor a regular file"<<std::endl;
                                    }
                    }
                    else
                    {
                            std::cout<<"The speicified path does not exist"<<std::endl;
                                                                                                                 }             
               }
    }
    

    最后,fsystem.h的内容是:

    fsystem.h

    #ifndef _fsystem_h
    #define _fsystem_h
    #include<iostream>
    #include<string>
    #include<vector>
    #include"boost/filesystem.hpp"
    using namespace std;
    vector<string>* listfiles(string);
    #endif
    

    有人可以告诉我在main.cpp链接过程中遇到的未定义引用错误的原因吗?如果你能帮我解决这个问题,我将不胜感激。

    由于

2 个答案:

答案 0 :(得分:2)

你没有链接提升。你需要在/src/filesystem/CMakeLists.txt的末尾添加target_link_libraries(fsystem ${Boost_LIBRARIES}),在find_package和add_library之间添加include_directories(${Boost_INCLUDE_DIRS})

cmake_minimum_required(VERSION 2.8)
project(fsystem)
set(CMAKE_BUILD_TYPE Release)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/build)
find_package(Boost REQUIRED system filesystem)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../lib)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${Boost_INCLUDE_DIRS})
add_library(fsystem SHARED listfiles.cpp)
target_link_libraries(fsystem ${Boost_LIBRARIES})

答案 1 :(得分:1)

(1)对于TARGET_LINK_LIBRARIES,您应该输入目标的名称,因此:

TARGET_LINK_LIBRARIES(main fsystem)

(2)当您将列表文件定义为vector<string>* listfiles(string)时,将列表文件声明为vector<string>* listfiles(int,char**)

此外,您需要根据其他回复链接Boost。