为库创建cmake安装宏

时间:2016-07-07 08:50:28

标签: c++ cmake static-libraries

这是我的项目结构:

main
|
--src
   |
   --feed.h
   --feed.cc
   --other files
   --CMakeLists2.txt
--test
   |
   --test.cpp
   --CMakeLists3.txt
CMakeLists1.txt

CMakeLists1.txt

cmake_minimum_required (VERSION 2.8.11)
project (Feedparser)

set(CMAKE_MODULE_PATH cmake)

find_package(PTHREAD REQUIRED)
find_package(CURL REQUIRED)

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 ")
elseif(COMPILER_SUPPORTS_CXX0X)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x ")
else()
        message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()

add_subdirectory (src)

add_subdirectory (test)

CMakeLists2.txt

cmake_minimum_required (VERSION 2.8.11)

add_library (Feedparser news.h xml2json.hpp jsonxx.cc curler.cc feed.cc )

target_link_libraries(Feedparser pthread)
target_link_libraries(Feedparser curl)

install(TARGETS Feedparser
        RUNTIME DESTINATION bin
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION /usr/lib)
install(FILES "feed.h" DESTINATION /usr/include  )
target_include_directories (Feedparser PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

CMakeLists3.txt

cmake_minimum_required (VERSION 2.8.11)

add_executable(Feedtest test.cc)

target_link_libraries (Feedtest LINK_PUBLIC Feedparser)

这是我的Header文件。

feed.h

#include "news.h"
#include "curler.cc"
#include "jsonxx.h"
#include "jsonxx.cc"
#include <iostream>
#include <sstream>
#include <stdlib.h>
#include <thread>
#include <stdio.h>
using namespace std;
using namespace jsonxx;

class feed{

    map <string,string> info;
    std::map<int, Object> items;
    string url;
    news News;
    Object *item;
    void strip_items();
    public:
        Object json;

        feed(string url);

        void create(string url){
            this->url = url;
        }
        feed(){}
        string get_topic(){
            return info["title"];
        }
        bool fetch();
        bool fetch_data();
        bool parse();
        string get_url(){
            return url;
        }
        string get_item_title(int index){
            return News.title[index];
        }

        string get_item_img(int index){
            return News.image[index];
        }

        string get_item_link(int index){
            return News.link[index];
        }

        int get_total(){
            return News.num_item;
        }

        struct news get_news(){
            return News;
        }



};

我应该在feed.cc中包含feed.h并编译,编译器如何直接将.h文件与档案中的.cxx文件链接起来?

如何编写用于安装此库的cmake脚本? 我的错误在哪里?

1 个答案:

答案 0 :(得分:0)

C ++的构建过程包括两个阶段:

编译:编译器在每个源(.cc)文件上运行,生成中间二进制文件。

链接:链接器在每个中间二进制文件上运行,与定义匹配声明。 最后,它结合了所有这些来制作最终的二进制文件。

考虑到这一点,您需要确保编译器没有遇到它不了解的内容。这就是您添加标题(.h)的原因。

链接器应该包含编译器创建的所有内容。