2016-07-15 4 views
1

Я использую JetBrains CLion для разработки C (C ANSI), я знаю, что это цель - C++, но моя компания работает только с C и CLion использует только систему CMake as build.Ошибка компоновщика с CMake

Моя система - это система Jessie Debian и установлены sqlite3 и libsqlite3-dev.

Я пытаюсь создать простой проект sqlite3, как это:

#include <sqlite3.h> 
#include <stdio.h> 

    int main() { 
    sqlite3 *sqlConnection; 
    int ret; 
    ret = sqlite3_open("database/path.db, &sqlConnection); 
    if (ret) { 
     printf("Ups ... can't open %d", ret); 
    } 
    do_some_queries(sqlConnection); 
    return 0; 
} 

Автоматический генерироваться CMakeLists.txt является follwing.

cmake_minimum_required(VERSION 3.3) 


project(Project) 

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

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

Когда сборка, либо через Clion, либо с помощью командной строки, я получаю ошибки компоновщика:

... 
undefined reference to `sqlite3_prepare_v2' 
undefined reference to `sqlite3_column_int' 
undefined reference to `sqlite3_open' 
... 

Я знаю, что я должен указать на CMake, где sqlite3, но я не могу найти способ сделать это.

«find_package» и «find_library» могут это сделать, но я не могу найти способ.

Я также нашел this Cmake file, но не смог успешно использовать.

Итак, как мне интегрировать sqlite3 с Cmake?

+0

Добавьте 'sqlite3.c' к источникам. –

+0

@CL. вы скачаете исходный код sqlite3 и скомпилируете его вместе с проектом? Я пробовал это и получал другие ошибки компоновщика (threading и т. Д.), Более того, не нравится дублирование источников вокруг системы. Постарайтесь. –

+0

Возможный дубликат [как добавить компоновщик или компилировать флаг в cmake-файле] (http://stackoverflow.com/questions/11783932/how-to-add-linker-or-compile-flag-in-cmake-file) – usr1234567

ответ

2

Вам нужно добавить путь к заголовочному файлу sqlite в ваш путь include. Затем связать SQLite библиотеку с помощью target_link_libraries:

https://cmake.org/cmake/help/v3.3/command/target_link_libraries.html

+0

этот libsqlite3-dev уже поставил sqlite3.h на путь gcc, то же самое для опции -lsqlite3, так как я отправляю параметр «-lsqite3» для подкласса GCC на Cmake? –

+0

основан ... просто положил -lsqlite3 после -std = C++ 11 ... –

+0

Вы не поняли ответ, верно? sqlite3 следует добавить через target_link_libraries. – usr1234567

-1

Я основал обходной путь, но это не правильный способ сделать.

Поскольку на Debian работает «gcc main.c -lsqlite3» (с установленным libsqlite3-dev), передача флага -lsqlite3 в компоновщик делает трюк.

поэтому я изменил

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

в

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

И это сработало.

+0

-l - это флаг компоновщика, ваше не-решение просто работает случайно. Познакомьтесь с http://stackoverflow.com/questions/11783932/how-to-add-linker-or-compile-flag-in-cmake-file. – usr1234567

Смежные вопросы