Home > Net >  How to cross link libraries in CMake
How to cross link libraries in CMake

Time:08-15

In a c CMake project I have an executable main and two libraries lib1 and lib2. A function in lib1 needs a function from lib2 and visa versa. Also, lib1 only contains .h files. The main executable will use both libraries. When I try and "make" the project, I get an error:
error: redefinition of ‘void lib1()’.
The file structure looks somewhat like this

/path/to/my/project
├── CMakeLists.txt # Project directory
├── main.cpp
├── Lib1
│   ├── ...files (.h only)...
│   ├── CMakeLists.txt # lib1 cmake
├── Lib2
│   ├── ...source files (.cpp & .h)...
│   ├── CMakeLists.txt # lib2 cmake

The CMakeLists.txt in the Project directory includes the following:

add_executable(${PROJECT_NAME} main.cpp)

add_subdirectory(Lib1)
add_subdirectory(Lib2)

target_link_libraries(${PROJECT_NAME}
  lib2
  lib1
)

The CMakeLists.txt in the Lib1 directory includes the following:

add_library(lib1 INTERFACE)

target_include_directories(lib1
    INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
)

target_link_libraries(lib1 INTERFACE
    lib2
)

The CMakeLists.txt in the Lib2 directory includes the following:

add_library(lib2 ${SOURCES} ${HEADERS}) # SOURCES and HEADERS set in lines above

target_include_directories(lib2
    INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
)

target_link_libraries(lib2 
    lib1
)

If I had to guess, the issue is it is trying to import lib1 headers twice. Once from lib2 and once in my main executable. How do I link the libraries so that isn't an issue?

CodePudding user response:

I dont think it's anything related to cmake. Although convoluted (I'd do it in another way but hey it's your code) I think you are defining the body of a function in lib1 where it should reside in a cpp file.

Make that function lib1 inline.

inline void lib1() {
...
}

or alternatively defined it in the header and implement it in a body file

//lib1.h
void lib1(); 

Then

//lib1.cpp
#include "lib1.h"
void lib1() {
...
}
  • Related