2017-02-26 1 views
0

Ich bin neu in C-Entwicklung.Verknüpfung, Kompilieren und Ausführen eines C-Programms mit einer statischen Bibliothek

A I eine Bibliothek errichtet (statisch) in CLION

library.h

#ifndef MYLIB_LIBRARY_H 
#define MYLIB_LIBRARY_H 

int add(int a, int b); 
int sub(int a, int b); 

#endif 

library.c

#include "library.h" 
#include <stdio.h> 

int add(int a, int b) { 
    return a + b; 
} 

int sub(int a, int b) { 
    return a - b; 
} 

CMakeLists.txt

cmake_minimum_required(VERSION 3.6) 
project(MyLib) 

set(CMAKE_C_STANDARD 99) 

set(SOURCE_FILES library.c library.h) 
add_library(MyLib ${SOURCE_FILES}) 


B. Erstellt C Executable Projekt namens App und kopiert libMyLib.a in lib von App.

main.c

#include <stdio.h> 
#include "library.h" // error 

int main() { 
    printf("Hello, World!\n", add(1, 2)); // error 
    return 0; 
} 

CMakeLists.txt des Projekts App und angegebenen Ordner für den Linker.

cmake_minimum_required(VERSION 3.6) 
project(App) 

set(CMAKE_C_STANDARD 99) 

set(SOURCE_FILES main.c) 
link_directories(${PROJECT_SOURCE_DIR}/lib) 
add_executable(App ${SOURCE_FILES}) 

Frage. Wie kann ich mein Programm mit der statischen Bibliothek arbeiten lassen?

Antwort

0

Es gibt ein paar Dinge, die ich Ihr Beispiel ändern musste, um an der Arbeit:

  1. ein include Verzeichnis im Verzeichnis App erstellen.
  2. Setzen Sie library.h in dieses Include-Verzeichnis.
  3. Ändern Sie das Projekt CMakeLists.txt Datei:

    cmake_minimum_required(VERSION 3.6) 
    project(App) 
    
    set(CMAKE_C_STANDARD 99) 
    set(SOURCE_FILES main.c) 
    # get libMyLib.a 
    find_library(MY_LIB 
        NAMES libMyLib.a 
        PATHS ${PROJECT_SOURCE_DIR}/lib) 
    # get library.h 
    include_directories(${PROJECT_SOURCE_DIR}/include) 
    
    add_executable(App ${SOURCE_FILES}) 
    # link App with libMyLib.a 
    target_link_libraries(App ${MY_LIB}) 
    
+0

Danke, es hat funktioniert. Ich habe eine andere Frage, was sind die Konventionen für die Verteilung Ihrer Bibliothek.Wie Leute Bibliotheken von Drittanbietern erwarten, scheint ich '.a' und' .h' Dateien zusammen zu verteilen. Sollte ich auch 'libMyLib.a' und' library.h' im Include-Ordner platziert haben? –

+0

ein Vorschlag bitte? –

+1

Ich habe keine Erfahrung beim Verteilen von Bibliotheken, aber ich denke, die Konvention hat lib/Verzeichnis für '.a' und' .so' Dateien und ein Include-Verzeichnis für '.h' Dateien. Sie können auch eine Dokumentation und Tests für die Bibliothek hinzufügen. Hier ist ein Link zum jsoncpp-Bibliotheksrepo, der cmake verwendet: https://github.com/open-source-parsers/jsoncpp. Sie stellen die Quelldateien und Headerdateien bereit, die zum Erstellen der Bibliothek benötigt werden, und der Endbenutzer ist derjenige, der sie mit cmake/make erstellt. – Jay

0

Diese Zeile:

printf("Hello, World!\n", add(1, 2)); // error 

ist ein Fehler bei der Kompilierung zu erzeugen, keine Zeit

Der Grund verknüpfen ist Die printf() Funktion wird als erstes Argument übergeben (die Formatzeichenfolge) Hello, World!\n und die s econd Argument: add(1,2) Allerdings gibt es kein Format im Format-String für die Ergebnisse des Aufrufs add()

Der Compiler Ausgabe der Meldung:

warning: too many arguments for format [-Wformat-extra-args] 

Es gibt keinen Grund, die Suche zu Cmakelists.txt Datei bis nach der Korrektur der Kompilierprobleme

+0

danke schließlich habe ich es nach der anderen Antwort über cmake, ich möchte wissen, was ist die Verzeichnisstruktur, wenn es darum geht, 3rd-Party-C-Bibliotheken zu verteilen, und was ist die Konvention der Platzierung von ihnen in Ihrem Projekt? –

+1

Die einfachste Möglichkeit besteht darin, die Bibliotheken in ein (Ihre Präferenz-) Verzeichnis zu platzieren und dann einen Link an einer Stelle anzubringen, an der der Linker normalerweise aussieht, zum Beispiel in '/ usr/lib /' – user3629249

+0

aus kosmetischer Sicht, meiner Bibliothek Projekt hat meinen '.a' Dateinamen mit' lib' vorangestellt, ich habe ihn manuell umbenannt, aber der Compiler hat sich beim Linken beschwert. Wie kann ich konfigurieren, um einen Namen zu erstellen, den ich mag? –

Verwandte Themen