简体   繁体   中英

g++ error linking functions from static library

I have a Qt5 C++ program and I'm trying to link to a static library. The static library is senselock/libsenseEIV.a (relative to the main.cpp file). When I compile I see the output below:

                                                                      ^
g++ -Wl,-rpath,/opt/Qt/5.7/gcc_64/lib -o test1 main.o   -Lsenselock/libsenseEIV.a -L/opt/Qt/5.7/gcc_64/lib -lQt5Core -lpthread 
main.o: In function `test1()':
/test1/main.cpp:31: undefined reference to `S4Enum'
/test1/main.cpp:58: undefined reference to `S4Enum'
/test1/main.cpp:71: undefined reference to `S4Open'
/test1/main.cpp:83: undefined reference to `S4Control'
/test1/main.cpp:102: undefined reference to `S4Close'
collect2: error: ld returned 1 exit status
make: *** [Makefile:216: test1] Error 1
11:55:27: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project test1 (kit: Desktop Qt 5.7.1 GCC 64bit)
When executing step "Make"

and in my .pro file I have

LIBS += -Lsenselock/libsenseEIV.a

in case that matters. Can someone explain how to fix this error? The undefined reference errors all relate to functions located in that libsenseEIV.a library.

I don't understand if the compiler can't find the .a file or there's some other error.


UPDATE: I tried this syntax

LIBS += -Lsenselock -lsenseEIV

but it generates error

/usr/bin/ld: cannot find -lsenseEIV

Am I using the wrong library name? If so how would I find the name? (assuming this is compiled into the .a file)

This part of your command line is wrong:

 -Lsenselock/libsenseEIV.a

Should be:

 senselock/libsenseEIV.a

(The -Lfoo/bar.a tells linker to search directory foo/bar.a/ for libraries, which is not at all what you want.)

No -l prefix?

You can specify linking with libsenseEIV.a in the following (mostly equivalent) ways:

senselock/libsenseEIV.a
-Lsenselock -lsenseEIV
-Lsenselock -l:libsenseEIV.a

You're using the linker flags wrong, you should specify the library path after -L and the library name after -l . In other words you need to have both in the assignment to LIBS variable in your .pro file.

After all it turns out that you can use LIBS += -L$$PWD/senselock/ -lsenseEIV for your case

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