AU_yzy0050
AU_yzy0050

Reputation: 33

cmake: cannot find the shared library when coming to link stage

I'm trying to move my Makefile to cmake. The problem is that when it comes to linking stage, it cannot find the shared library.

My cmake is:

set(PROJECT_LINK_LIBS libsr_tps.so)
link_directories(absolute/path/to/the/library)

I also tried:

find_library(PROJECT_LINK_LIBS NAMES sr_tps PATHS "${PROJECT_SOURCE_DIR}/lib")

and then:

add_executable(project ${SOURCE})
target_link_libraries(project ${PROJECT_LINK_LIBS})

The sources can be cross-compiled successfully. But after compiling, it always says:

/absolute/path/to/ld: cannot find -lsr_tps
collect2: ld returned 1 exit status

given that libsr_tps.so has already been pre-cross-compiled.

Makefile works fine for both compiling and generating the final executable.

I have been looking for the potential issue for many hours. The solutions just don't work.

What could be wrong?

Thanks.


Update:

The way for build with make:

  1. Set some environment parameters, i.e. some export.
  2. Makefile:

    LDFLAGS += -L./lib
    CFLAGS += -Wall -Wno-pointer-sign
    LDLIBS = -lsr_tps
    all: $(TARGET)
    $(TARGET): $(OBJS) $(OBJS_ROS) 
         $(CC) $(LDFLAGS) $(OBJS) $(OBJS_ROS) $(LDLIBS) -o $(TARGET) 
         cp $^ ./$(BINARY)/$(OBJ_DIR) 
         mv $@ ./$(BINARY) 
    
    .c.o: $(CC) $(CFLAGS) -o $@ -c $<
    

Update 2:

Here is my Makefile:

TARGET = ros
LDFLAGS += -L./lib
CFLAGS += -Wall -Wno-pointer-sign -DWSU_5001 -I./include -I./include/WSU-5001_include -I./include/J2735 -I./ -pthread -O
LDLIBS = -lsr_tps -lrisapi -lrt -lipc -lm -ldot2 -ldot3 -lcrypto -lgps -ltpsapi
SHARED_FLAGS = -fPIC -shared

BINARY= bin
SRC_DIR = ./src
J2735_DIR = ./src/J2735
#OBJ_DIR = ./binary/obj
OBJ_DIR = obj

OBJS_TEST=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o}
OBJS=${ASN_MODULE_SOURCES:.c=.o}
OBJS_ROS = ros.o tx.o rx.o util.o config.o

all: $(TARGET)
    mkdir -p $(BINARY)
    mkdir -p $(BINARY)/$(OBJ_DIR)

$(TARGET): $(OBJS) $(OBJS_ROS)
    $(CC) $(LDFLAGS) $(OBJS) $(OBJS_ROS) $(LDLIBS) -o $(TARGET) 
    cp $^ ./$(BINARY)/$(OBJ_DIR)
    mv $@ ./$(BINARY)

# $(TARGET): $(OBJS)
#   $(CC) $(OBJS) $(CFLAGS) -o $@

.SUFFIXES:
.SUFFIXES: .c .o

.c.o:
    $(CC) $(CFLAGS) -o $@ -c $<

Command line after executing make:

path/to/powerpc-e300c3-linux-gnu-gcc -L./lib <all .o files> -lsr_tps -lrisapi -lrt -lipc -lm -ldot2 -ldot3 -lcrypto -lgps -ltpsapi -o ros

And below is my CMakeList:

cmake_minimum_required(VERSION 3.5.1)
project(Denso-ROS)

set(CMAKE_SYSTEM_NAME Denso-linux)
set(CMAKE_SYSTEM_PROCESSOR "^(powerpc|ppc)")

set(GCC_COVERAGE_COMPILE_FLAGS "-static -Wall -Wno-pointer-sign -DWSU_5001 -pthread -O")

#################
#problem

#set(GCC_COVERAGE_LINK_FLAGS "libsr_tps.so -lrisapi -lrt -lipc -lm -ldot2 -ldot3 -lcrypto -lgps -ltpsapi")
#set(GCC_COVERAGE_LINK_FLAGS "-L./lib")

#set(CMAKE_LINK_LIBRARY_FLAG "-lsr_tps -lrisapi -lrt -lipc -lm -ldot2 -ldot3 -lcrypto -lgps -ltpsapi")

#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}" )

set(PROJECT_LINK_LIBS libsr_tps.so)
link_directories(home/yufeiyan/DENSO-WSU5K1-SDK_VM_Ubuntu_Peloton/Denso/lib)

#################
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )

set(tools ${PROJECT_SOURCE_DIR}/toolchain/bin)
set(CMAKE_C_COMPILER ${tools}/powerpc-e300c3-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${tools}/powerpc-e300c3-linux-gnu-g++)

find_library(DENSO_LIB NAMES sr_tps PATHS "${PROJECT_SOURCE_DIR}/lib")  
message(STATUS "${DENSO_LIB}")

include_directories(
    ${PROJECT_SOURCE_DIR}
    include
    include/J2735
    include/WSU-5001_include)


file(GLOB SOURCE ${PROJECT_SOURCE_DIR}/*.c src/*.c src/J2735/*.c)
list(REMOVE_ITEM SOURCE ${PROJECT_SOURCE_DIR}/src/J2735/converter-example.c)
list(REMOVE_ITEM SOURCE ${PROJECT_SOURCE_DIR}/src/J2735/test.c)

#add_executable(ros ${SOURCE1} ${SOURCE2} ${SOURCE3})

add_executable(ros ${SOURCE})
target_link_libraries(ros ${PROJECT_LINK_LIBS})

Command line after executing make:

path/to/powerpc-e300c3-linux-gnu-gcc   -static -Wall -Wno-pointer-sign -DWSU_5001 -pthread -O <all .o files> -L/path/to/project/lib -lsr_tps -Wl,-rpath, path/to/project/lib path/tp/powerpc-e300c3-linux-gnu/bin/ld: cannot find -lsr_tps

Upvotes: 0

Views: 916

Answers (1)

AU_yzy0050
AU_yzy0050

Reputation: 33

Many thanks to Tsyvarev.

Let me sum up the issue and solution:

The linker can not find the library due to the incorrect path. I used link_directories(absolute/path/to/lib), and it returned a duplicate path. Instead, using link_directories(${PROJECT_SOURCE_DIR}/lib) solved the problem. The linker has the correct path and find the library.

In the meantime, I remove the -static option for CFLAGS. This option may also cause the linker not finding the library.

Upvotes: 1

Related Questions