2015-07-30 2 views
0

Я хочу сгенерировать общую библиотеку с CMake, и хотя я не получаю никаких ошибок, библиотека (.so-файл) не создается.Cmake не может генерировать общую библиотеку, но создается статическая библиотека

Вот мой CMakeLists.txt

cmake_minimum_required(VERSION 2.8) 

project(myTest) 

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g3 -Wall -c -fmessage-length=0 -v -fPIC") 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -fPIC") 


add_definitions(-DLINUX=1) 

include_directories(
    ${PROJECT_SOURCE_DIR}/public/include 
    # .. bunch of other include directories 
) 

link_directories("${PROJECT_SOURCE_DIR}/shared/lib") 


file(GLOB_RECURSE SRC_FILES 
    "${PROJECT_SOURCE_DIR}/source/some1.cpp" 
    "${PROJECT_SOURCE_DIR}/source/some2.cpp" 
    ) 

add_library(myTest SHARED ${SRC_FILES}) 

Когда я создаю построить реж, генерировать сделать файлы из CMake и выполнить настройку по умолчанию цель грим, я не вижу каких-либо ошибок.

[ 50%] Building CXX object /path/to/some1.cpp.o 
[100%] Building CXX object /path/to/some2.cpp.o 
Linking CXX shared library myTest.so 
g++: warning: /path/to/some1.cpp.o: linker input file unused because linking not done 
g++: warning: /path/to/some2.cpp.o: linker input file unused because linking not done 
[100%] Built target myTest 

Но когда я вижу в моей папке сборки, так файл, libmytest.so не генерируется. Он не генерируется нигде, поскольку я нахожусь на всей моей системе.

Удивительно, но когда я меняю тип библиотеки STATIC, создается файл libmytest.a. Я пропустил что-то очевидное здесь?

+0

Я бы заподозрил флаг -c в вашем 'set (CMAKE_C [XX] _FLAGS ...)'. Они не нужны, поскольку CMake будет знать, чтобы создавать Makefile с правилами, которые создают файлы .o для соответствующих исходных файлов. – Alain

+0

Ах .. вот и все. , Пропустил его . , Скопировал CXX_FLAGS из затмения и забыл удалить его. Благодарю. – Anoop

ответ

1

Ошибка была произведена CMAKE_C_FLAGS и CMAKE_CXX_FLAGS. Для компиляции от .cpp до .o, g ++ нужны флагов -c, но cmake автоматически добавит их для нас.

Но при генерации библиотеки .so g ++ не может понять значение флага -c. Следовательно, он не генерировал файл .so, не давая никаких ошибок.

После удаления флага -c он смог сгенерировать общую библиотеку .so.

Обратите внимание, что для генерации статической библиотеки вместо g ++ используется архиватор, поэтому статическая библиотека была сгенерирована без ущерба для.

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