2012-07-02 21 views
8

Ho tre file:CMake creare un oggetto condiviso

lib.c lib.h => Si dovrebbe essere costruito come un file .so
client.c => Questo dovrebbe essere costruito come un file eseguibile.
All'interno del client.c includo il file lib.h in modo da ottenere le dichiarazioni delle funzioni definite in lib.c

qualcuno può dirmi il file CMakeLists esatte che dovrei usare in modo che l'area di origine non è ordinato con i file temporanei di Cmake e i binari e le librerie (.dlls nel caso di Windows credo) generati in directory di compilazione e binari separate?

risposta

4

cmake si basa sulla directory di costruzione separata di default (non ho la prova questo esempio):

PROJECT(myproject) 
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 

SET(mylibSRCS lib.c) 
SET(myprogSRCS client.c) 

ADD_LIBRARY(mylib ${mylibSRCS}) 
ADD_EXECUTABLE(myprog ${myprogSRCS}) 

TARGET_LINK_LIBRARIES(myprog mylib) 

Fate:

mkdir build 
cd build 
cmake .. 
make 

Tutto sarebbe in costruzione.

+0

C'è un modo per fare la costruzione sempre in una nuova directory senza eseguire questi comandi della shell? Ho cercato su Google ma non ho trovato nessun link utile. –

+0

http://stackoverflow.com/questions/11143062/getting-cmake-to-build-out-of-source-without-wrapping-scripts/11144109#11144109 – Fraser

+0

Sì. Puoi 'mkdir build & cd build & cmake .. & make'. Se hai bisogno di pulire il tuo repository, cancella semplicemente la directory di build. Questo isola le cose generate dalle tue fonti originali. – Stewart

11

Questa soluzione non creerà un file .so, ma un equivalente cmake per l'ulteriore inclusione con cmake.
Sto cercando una soluzione fornirà l'equivalente di questo:

g++ -shared -Wl,-soname,plugin_lib.so.1 -o plugin_lib.so plugin_lib.o 

che genererà una plugin_lib.so che può essere caricato in modo dinamico con dlopen in fase di esecuzione.

La soluzione non è presente l'opzione "CONDIVISA" in questo modo:

ADD_LIBRARY(mylib SHARED ${mylibSRCS}) 
+0

La risposta accettata deve essere aggiornata –

Problemi correlati