简体   繁体   中英

Can't build with Cmake

I am new to Cmake and I am trying to create a CMakeLists.txt to build my project. I can build my project from command line using g++ compiler but when it comes to Cmake I am confused.

The directory structure is like this :

Project_folder
   |--> Source
       |--> main.cpp
       |--> file1.cpp
       |--> file2.cpp
   |--> Header
       |--> header1.h
       |--> header2.h
   |--> build (from where I run cmake .. and make)
       CMakeLists.txt (this is under Project_folder)
Dependencies
   |--> utils
       |--> Utils.cpp
   |--> include (has many folders in here)
   |--> build (this path is in LD_LIBRARY_PATH as well)
       |--> sharedlib1.so
       |--> sharedlib2.so

Now from within the Project_Folder I can successfully run :

g++ ./Source/main.cpp ./Source/file1.cpp ./Source/file2.cpp ../Dependencies/utils/Utils.cpp -I ../Dependencies -I ../Dependencies/include/ -I ./Header/ -L ../Dependencies/build -std=c++11 -lsharedlib1 -lsharedlib2 -o ./build/main `pkg-config opencv --cflags --libs`

and generate the executable file.

Now I want to configure a CMakeLists.txt and try to replicate what the above compiler line is doing but with no success (I can cmake .. , but I cannot make ). CMakeLists.txt looks like this :

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

project(my_project)

#For the shared library:
set ( PROJECT_LINK_LIBS sharedlib1.so sharedlib2.so)
link_directories(${PROJECT_SOURCE_DIR}/../Dependencies/build/ )

include_directories(${PROJECT_SOURCE_DIR}/../Dependencies ${PROJECT_SOURCE_DIR}/../Dependencies/include ${PROJECT_SOURCE_DIR}/Header)
file(GLOB SOURCES "Source/*.cpp" )

set(CMAKE_CXX_FLAGS_RELEASE pkg-config opencv cflags libs)

## add_executable(name_of_output.o list_of_cpp_files)
add_executable(build ${SOURCES})

Running make after generating the makefile I get undefined reference to everything inside main.cpp. Is there anything obvious in the CMakeLists.txt that I should change?

Your call to g++ includes the ../Dependencies/utils/Utils.cpp file, but your call to add_executable is only using the files matched by Source/*.cpp . A quick solution would be to add ../Dependencies/Utils.cpp to the call to add_executable() making it

add_executable(build ${SOURCES} "${PROJECT_SOURCE_DIR}/../Dependencies/Utils.cpp")

On a related note: CMake discourages using file(GLOB ...) to get a list of source files, it's generally better to list the source files explicitly

You should use target_link_libraries after add_executable .

Please check the examples:

While running the application you will also get some errors. Please be aware of RPATH.

Ok I managed to solve it ! :)

# set Cmake minimum version to use
cmake_minimum_required(VERSION 2.8.9)

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

# name your project
project(my_project)
set(CMAKE_BUILD_TYPE Release)

# Find and load the settings from the packages
find_package(PkgConfig REQUIRED)
find_package(OpenCV REQUIRED )

# set the extra flags 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -cflags -libs")

# set the shared libraries name (where the libraries are libsharedlib1.so and libsharedlib2.so + opencv runtime libraries)
set(PROJECT_LINK_LIBS sharedlib1 sharedlib2) ${OpenCV_LIBS}

# include the header files (.h)
include_directories(${PROJECT_SOURCE_DIR}/../Dependencies ${PROJECT_SOURCE_DIR}/../Dependencies/include ${PROJECT_SOURCE_DIR}/Header)

# add the source files (.cpp) using the set command as follow
set(SOURCES
Source/main.cpp
Source/file1.cpp
Source/file2.cpp
${PROJECT_SOURCE_DIR}/../Dependencies/utils/Utils.cpp)

# link the shared libraries (/build/libsharedlib1.so and /build/libsharedlib2.so)
link_directories(${PROJECT_SOURCE_DIR}/../Dependencies/build/)

# add_executable(name_of_output list_of_cpp_files)
add_executable(main ${SOURCES})

# link the executable with the shared libraries
target_link_libraries(main ${PROJECT_LINK_LIBS} )

and finally ./main will run the program !

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM