如何设置CMake与外部库(sqlpp11)一起使用?

时间:2017-03-07 23:11:45

标签: c++ mysql linux cmake

我已经获得了cpp应用程序所需的两个库。

https://github.com/rbock/sqlpp11
https://github.com/rbock/sqlpp11-connector-mysql

我将它们与libmysqlclient-dev和日期库一起下载。当我在项目cmake ..make的每个项目中创建构建目录并运行make tests时,所有库测试都有效。

我使用import_library()导入项目根目录中的两个库,并且build dir中没有cmake ..的错误。当我运行make代码时,即使<sqlpp11/sqlpp11.h>运行正常,代码仍无法找到cmake ..的包含。以下是我的根CMakeLists.txt和我的src CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(mysql_sample)

set(HinnantDate_ROOT_DIR "${PROJECT_SOURCE_DIR}/date")

find_library(sqlpp11 REQUIRED)
include_directories(${sqlpp11_INCLUDE_DIRS})

find_library(sqlpp11-connector-mysql REQUIRED)
include_directories(${sqlpp11-connector-mysql_INCLUDE_DIRS})

include_directories(${PROJECT_SOURCE_DIR}/include)

add_subdirectory(include)
add_subdirectory(src)
add_subdirectory(test)

add_executable(mysql_sample main.cpp)

target_link_libraries(mysql_sample ${sqlpp11_LIBRARIES}) 
target_link_libraries(mysql_sample ${sqlpp11-connector-mysql_LIBRARIES})

修改1

回应评论错误

Maker Error at /usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:148 (message):
  Could NOT find Sqlpp11-connector-mysql (missing:
  sqlpp11-connector-mysql_INCLUDE_DIR)
Call Stack (most recent call first):
  /usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE)
  CMake/FindSqlpp11-connector-mysql.cmake:7 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:15 (find_package)


-- Configuring incomplete, errors occurred!
See also "/home/andrew/cpp_work/sql_sample_project/build/CMakeFiles/CMakeOutput.log".
See also "/home/andrew/cpp_work/sql_sample_project/build/CMakeFiles/CMakeError.log".

使用CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(mysql_sample)

set(HinnantDate_ROOT_DIR "${PROJECT_SOURCE_DIR}/date")

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/CMake)

find_package(Sqlpp11 REQUIRED)
include_directories(${sqlpp11_INCLUDE_DIRS})

set(include_dir "${PROJECT_SOURCE_DIR}/include")
file(GLOB_RECURSE sqlpp_headers ${include_dir}/*.h ${SQLPP11_INCLUDE_DIR}/*.h)
include_directories(${include_dir})

find_package(Sqlpp11-connector-mysql REQUIRED)
include_directories(${sqlpp11-connector-mysql_INCLUDE_DIRS})

file(GLOB_RECURSE sqlpp11-connector-mysql_headers ${include_dir}/*.h ${sqlpp11-connector-mysql_INCLUDE_DIR}/*.h)
include_directories(${include_dir})

add_executable(mysql_sample src/main.cpp)

target_link_libraries(mysql_sample ${sqlpp11_LIBRARIES})
target_link_libraries(mysql_sample ${sqlpp11-connector-mysql_LIBRARIES})

include_directories(${PROJECT_SOURCE_DIR}/include)

add_subdirectory(include)
add_subdirectory(src)
add_subdirectory(test)

和FindSqlpp11.cmake

find_path(SQLPP11_INCLUDE_DIR sqlpp11.h
    ${PROJECT_SOURCE_DIR}/sqlpp11
    ${PROJECT_SOURCE_DIR}/include/sqlpp11
)

include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Sqlpp11 DEFAULT_MSG SQLPP11_INCLUDE_DIR)

mark_as_advanced(SQLPP11_INCLUDE_DIR)

和FindSqlpp11-connector-mysql.cmake

find_path(Sqlpp11-connector-mysql_INCLUDE_DIR sqlpp11-connector-mysql.h
    ${PROJECT_SOURCE_DIR}/sqlpp11-connector-mysql
    ${PROJECT_SOURCE_DIR}/include/sqlpp11-connector-mysql
)

include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Sqlpp11-connector-mysql DEFAULT_MSG sqlpp11-connector-mysql_INCLUDE_DIR)

mark_as_advanced(Sqlpp11-connector-mysql_INCLUDE_DIR)

为什么这里有错误,我是否在正确的轨道上?

修改2

我成功完成了上述工作,我的问题是我没有正确安装。我现在从此代码中收到以下错误。

main.cpp:(.text+0x124): undefined reference to `sqlpp::mysql::connection::connection(std::shared_ptr<sqlpp::mysql::con
nection_config> const&)'                                                                                              
main.cpp:(.text+0x12e): undefined reference to `sqlpp::mysql::connection::~connection()'                              
collect2: error: ld returned 1 exit status                                                                            
CMakeFiles/mysql_sample.dir/build.make:94: recipe for target 'mysql_sample' failed                                    
make[2]: *** [mysql_sample] Error 1                                                                                   
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/mysql_sample.dir/all' failed                                   
make[1]: *** [CMakeFiles/mysql_sample.dir/all] Error 2                                                                
Makefile:83: recipe for target 'all' failed                                                                           
make: *** [all] Error 2   

代码:

include "TabSample.h"
#include <sqlpp11/sqlpp11.h>
#include <sqlpp11/mysql/mysql.h>

namespace mysql = sqlpp::mysql;
int main()
{
    auto config = std::make_shared<mysql::connection_config>();
    config->user = "root";
    config->database = "sqlpp_mysql";
    config->debug = true;
    mysql::connection db(config);

    TabSample tab;
    for(const auto& row : db.run(sqlpp::select(all_of(tab)).from(tab).unconditionally()))
    {
        std::cerr << "row.alpha: " << row.alpha << ", row.beta: " << row.beta << ", row.gamma: " << row.gamma <<  std::endl;
    };
  return 0;
}

我正在使用gcc 4.9并且make / make install没有错误,我在CMakeLists.txt中遗漏了什么?

cmake_minimum_required(VERSION 3.5)
project(mysql_sample)

set(HinnantDate_ROOT_DIR "/usr/local/lib/date")
include_directories(/usr/local/lib/date)
if(UNIX)
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=gnu++0x")
endif()

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/CMake)

set(SQLPP11_INCLUDE_DIR /usr/local/include)

find_package(Sqlpp11 REQUIRED)

add_executable(mysql_sample src/main.cpp)

target_link_libraries(mysql_sample ${sqlpp11_LIBRARIES})
target_link_libraries(mysql_sample ${sqlpp11-connector-mysql_LIBRARIES})

include_directories(${PROJECT_SOURCE_DIR}/include)

add_subdirectory(include)
add_subdirectory(src)
add_subdirectory(test)

的CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(mysql_sample)

set(HinnantDate_ROOT_DIR "/usr/local/lib/date")
include_directories(/usr/local/lib/date)
set(CMAKE_CXX_STANDARD 11)

if(UNIX)
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
endif()

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/CMake)

set(SQLPP11_INCLUDE_DIR /usr/local/include)

find_package(Sqlpp11 REQUIRED)

add_executable(mysql_sample src/main.cpp)

include_directories(${sqlpp11_INCLUDE_DIRS})
include_directories(${sqlpp11-connector-mysql_INCLUDE_DIRS})

target_link_libraries(mysql_sample ${sqlpp11_LIBRARIES})
target_link_libraries(mysql_sample ${sqlpp11-connector-mysql_LIBRARIES})
target_link_libraries(mysql_sample mysqlclient)

include_directories(${PROJECT_SOURCE_DIR}/include)

add_subdirectory(include)
add_subdirectory(src)
add_subdirectory(test)

FindSqlpp11连接器-mysql.cmake

## -----------------------------------------------------------------------------
## Check for the library

find_library (sqlpp11-connector-mysql-mysql_LIBRARIES sqlpp11-connector-mysql-mysql
  PATHS usr/local/cmake /usr/local/cmake/sqlpp11-connector-mysql-mysql /usr/local/lib /usr/lib /lib /sw/lib /usr/local/include
  )

## -----------------------------------------------------------------------------
## Actions taken when all components have been found

if (sqlpp11-connector-mysql-mysql_INCLUDES AND sqlpp11-connector-mysql-mysql_LIBRARIES)
  set (HAVE_sqlpp11-connector-mysql-mysql TRUE)
else (sqlpp11-connector-mysql-mysql_INCLUDES AND sqlpp11-connector-mysql-mysql_LIBRARIES)
  if (NOT sqlpp11-connector-mysql-mysql_FIND_QUIETLY)
    if (NOT sqlpp11-connector-mysql-mysql_INCLUDES)
      message (STATUS "Unable to find sqlpp11-connector-mysql-mysql header files!")
    endif (NOT sqlpp11-connector-mysql-mysql_INCLUDES)
    if (NOT sqlpp11-connector-mysql-mysql_LIBRARIES)
      message (STATUS "Unable to find sqlpp11-connector-mysql-mysql library files!")
    endif (NOT sqlpp11-connector-mysql-mysql_LIBRARIES)
  endif (NOT sqlpp11-connector-mysql-mysql_FIND_QUIETLY)
endif (sqlpp11-connector-mysql-mysql_INCLUDES AND sqlpp11-connector-mysql-mysql_LIBRARIES)

if (HAVE_sqlpp11-connector-mysql-mysql)
  if (NOT sqlpp11-connector-mysql-mysql_FIND_QUIETLY)
    message (STATUS "Found components for sqlpp11-connector-mysql-mysql")
    message (STATUS "sqlpp11-connector-mysql-mysql_INCLUDES = ${sqlpp11-connector-mysql-mysql_INCLUDES}")
    message (STATUS "sqlpp11-connector-mysql-mysql_LIBRARIES     = ${sqlpp11-connector-mysql-mysql_LIBRARIES}")
  endif (NOT sqlpp11-connector-mysql-mysql_FIND_QUIETLY)
else (HAVE_sqlpp11-connector-mysql-mysql)
  if (sqlpp11-connector-mysql-mysql_FIND_REQUIRED)
    message (FATAL_ERROR "Could not find sqlpp11-connector-mysql-mysql!")
  endif (sqlpp11-connector-mysql-mysql_FIND_REQUIRED)
endif (HAVE_sqlpp11-connector-mysql-mysql)

mark_as_advanced (
  HAVE_sqlpp11-connector-mysql-mysql
  sqlpp11-connector-mysql-mysql_LIBRARIES
  sqlpp11-connector-mysql-mysql_INCLUDES
)

和错误输出:

root@beaglebone:~/cpp_work/sql_sample_project/build# cmake ..     
-- Attempting to find SQLPP11 FILES                               
-- Unable to find SQLPP11 library files!                          
-- Unable to find sqlpp11-connector-mysql-mysql header files!     
-- Unable to find sqlpp11-connector-mysql-mysql library files!    
-- Configuring done                                               
-- Generating done       

0 个答案:

没有答案