1

I am trying to make a cmake file for my project just to learn how to make a cmake file.

My directory Structure. I am getting an error :

square_and_add
|- src
| |- <Some source files>
|- libsrc
| |- include
| |- <library header files>
| |- src
| |- <library source files>
|- build
|- libs
|- <installed libraries>

cmake_minimum_required(VERSION 2.6)
project(SQUARE_AND_ADD)
set(CMAKE_CXX_FLAGS "-g -Wall")

include_directories(./libsrc/include)
include_directories(./libsrc/src)
include_directories(./build)

add_executable(no_lib_exec ./src/main.cc)
target_link_libraries(no_lib_exec ./libsrc/src/square.cc)
set_target_properties(no_lib_exec PROPERTIES PREFIX "" OUTPUT_NAME sqnadd_no_lib)

add_library(build_static_lib STATIC ./libsrc/src/square.cc)
set_target_properties(build_static_lib PROPERTIES PREFIX "" OUTPUT_NAME static_library)

add_executable(static_lib_exec ./src/main.cc)
target_link_libraries(static_lib_exec ./build/static_library.a)
set_target_properties(static_lib_exec PROPERTIES PREFIX "" OUTPUT_NAME sqnadd_stat_lib)

add_library(build_dynamic_lib SHARED ./libsrc/src/square.cc)
set_target_properties(build_dynamic_lib PROPERTIES PREFIX "" OUTPUT_NAME dynamic_library)

add_executable(dynamic_lib_exec ./src/main.cc)
target_link_libraries(dynamic_lib_exec ./build/dynamic_library.so)
set_target_properties(dynamic_lib_exec PROPERTIES PREFIX "" OUTPUT_NAME sqnadd_dyn_lib)

install(TARGETS dynamic_lib_exec static_lib_exec
        RUNTIME DESTINATION ./libs CONFIGURATIONS debug)

I am getting this error

/usr/bin/ld: cannot find -l./build/dynamic_library collect2: error: ld returned 1 exit status CMakeFiles/dynamic_lib_exec.dir/build.make:85: recipe for target 'sqnadd_dyn_lib' failed

m.s.
  • 16,063
  • 7
  • 53
  • 88
  • why don't you just use `target_link_libraries(dynamic_lib_exec build_dynamic_lib)`? – m.s. Aug 24 '15 at 16:06

1 Answers1

0

Here is my approach on doing such things:

cmake_minimum_required(VERSION 2.6)
project(SQUARE_AND_ADD)
set(CMAKE_CXX_FLAGS "-g -Wall")

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/libsrc/include)

set(EXEC_NAME_BASE "sqnadd")
set(EXEC_NOLIB_NAME "${EXEC_NAME_BASE}_no_lib")
set(EXEC_STATICLIB_NAME "${EXEC_NAME_BASE}_stat_lib")
set(EXEC_SHAREDLIB_NAME "${EXEC_NAME_BASE}_dyn_lib")

set(STATICLIB_NAME "square_static")
set(SHAREDLIB_NAME "square_shared")


# if no lib, then just compile the square.cc into the executable
add_executable(${EXEC_NOLIB_NAME} src/main.cc libsrc/src/square.cc)


add_library(${STATICLIB_NAME} STATIC libsrc/src/square.cc)

add_executable(${EXEC_STATICLIB_NAME} src/main.cc)
target_link_libraries(${EXEC_STATICLIB_NAME} ${STATICLIB_NAME} )


add_library(${SHAREDLIB_NAME} SHARED libsrc/src/square.cc)

add_executable(${EXEC_SHAREDLIB_NAME} src/main.cc)
target_link_libraries(${EXEC_SHAREDLIB_NAME} ${SHAREDLIB_NAME})


# installing libraries:
install(TARGETS ${SHAREDLIB_NAME} ${STATICLIB_NAME}
        RUNTIME DESTINATION lib CONFIGURATIONS debug)

# installing executables
install(TARGETS ${EXEC_NOLIB_NAME} 
                ${EXEC_STATICLIB_NAME} 
                ${EXEC_SHAREDLIB_NAME}
        RUNTIME DESTINATION bin
        CONFIGURATIONS debug)