2016-07-15 15 views
1

Ich benutze JetBrains CLion für reine C (C ANSI) Entwicklung, ich weiß, es ist Ziel C++, aber meine Firma arbeitet nur mit C und CLion verwendet nur CMake als Build-System.Linker Fehler mit CMake

Mein System ist ein Debian Jessie System und sqlite3 und libsqlite3-dev sind installiert.

Ich versuche, ein einfaches sqlite3 Projekt wie diese zu bauen:

#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; 
} 

Das automatisch generierte CMakeLists.txt das follwing ist.

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}) 

Wenn bauen, entweder durch Clion, entweder über die Befehlszeile, I-Linker Fehler erhalten:

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

Ich weiß, ich CMake müssen darauf hinweisen, wo sqlite3 ist, aber ich kann ein nicht gefunden Art und Weise dies zu tun.

"find_package" und "find_library" können es tun, aber ich kann nicht finden, wie.

Ich habe auch this Cmake file gefunden, konnte aber nicht erfolgreich verwendet werden.

Also, wie integriere ich sqlite3 mit Cmake?

+0

Fügen Sie 'sqlite3.c' zu den Quellen hinzu. –

+0

@ CL. Sie sagen, sqlite3 Quellcode herunterladen und zusammen mit dem Projekt zu kompilieren? Ich habe es versucht und bekam andere Linker-Fehler (Threading und etc), außerdem, duplizieren Quellen nicht um das System herum. Wird es hart versuchen. –

+0

Mögliches Duplikat von [Wie Linker oder Compiler-Flag in cmake-Datei hinzufügen] (http://stackoverflow.com/questions/11783932/how-to-add-linker-or-compile-flag-in-cmake-file) – usr1234567

Antwort

2

Sie müssen den Pfad zur SQLite-Headerdatei zu Ihrem Include-Pfad hinzufügen. Dann verbinden die SQLite-Bibliothek mit target_link_libraries:

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

+0

Dieser libsqlite3-dev hat bereits sqlite3.h auf den gcc-Pfad gesetzt, dasselbe für die Option -lsqlite3, also wie ich die "-lsqlite3" -Option für den zugrunde liegenden GCC auf Cmake sende? –

+0

gegründet ... nur -lsqlite3 nach -std = C++ 11 ... –

+0

Sie haben die Antwort nicht verstanden, oder? sqlite3 sollte über target_link_libraries hinzugefügt werden. – usr1234567

-1

ich eine Abhilfe gegründet habe, aber es ist nicht die richtige Art und Weise zu tun.

Da auf Debian die "gcc main.c -lsqlite3" funktioniert (mit libsqlite3-dev installiert), die Weitergabe der -lsqlite3 Flag an den Linker tun den Trick.

so habe ich geändert

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

zu

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

Und es funktionierte.

+0

-l ist ein Linker-Flag, Ihre Nicht-Lösung funktioniert nur zufällig. Sehen Sie sich http://stackoverflow.com/questions/11783932/how-to-add-linker-or-compile-flag-in-cmake-file genauer an – usr1234567