I have 3 files in a directory. I will build ll.cc
to libmylib.so
, and build main.cc
to myexe
.
Use these command to build
g++ -Wall -g -fPIC -std=c++11 ll.cc -shared -o libmylib.so
g++ -Wall -g -std=c++11 main.cc -L. -lmylib -o myexe
But, g++ report a error when build myexe
:
./libmylib.so: undefined reference to `submarinex::LIB::kCount'
collect2: error: ld returned 1 exit status
Files:
ll.h
namespace submarinex {
class LIB {
public:
void Print();
private:
static const int kCount = 100;
};
} // namespace submarinex
ll.cc
#include "ll.h"
#include <algorithm>
#include <iostream>
namespace submarinex {
void LIB::Print() {
int min = std::min(101, kCount);
std::cout << min << std::endl;
// std::cout << kCount << std::endl;
}
} // namespace submarinex
main.cc
#include "ll.h"
int main(int argc, char **argv) {
submarinex::LIB lib;
lib.Print();
return 0;
}
Case 1
:
If use these 2 lines in Print
, will report an error when link object of main.cc
int min = std::min(101, kCount);
std::cout << min << std::endl;
Case 2
:
If use this line in Print
, will success
std::cout << kCount << std::endl;
If change
static const int kCount = 100;
to
const int kCount = 100;
it also be OK regardless of using Case1
or Case2
.
I don't know how to solve this problem.
I think there is no definition of the kCount variable in your source code.
So, your variable must be defined somewhere in your source code, ll.cc.
In the ll.h
namespace submarinex {
class LIB {
private:
const static int kCount =100;
public:
void Print();
};
} // namespace submarinex
Then, you can define a kCount variable in the ll.cc
#include "ll.h"
#include <algorithm>
#include <iostream>
namespace submarinex
{
const int LIB::kCount; //<== here
void LIB::Print() {
int min = std::min(101, kCount);
std::cout << min << std::endl;
// std::cout << kCount << std::endl;
}
} // namespace submarinex
This is my gcc version information
$ gcc -v
Using built-in specs.
COLLECT_GCC=C:\DEV\COMP\msys32\mingw32\bin\gcc.exe
COLLECT_LTO_WRAPPER=C:/DEV/COMP/msys32/mingw32/bin/../lib/gcc/i686-w64-mingw32/6.3.0/lto-wrapper.exe
Target: i686-w64-mingw32
Configured with: ../gcc-6.3.0/configure --prefix=/mingw32 --with-local-prefix=/mingw32/local --build=i686-w64-mingw32 --host=i686-w64-mingw32 --target=i686-w64-mingw32 --with-native-system-header-dir=/mingw32/i686-w64-mingw32/include --libexecdir=/mingw32/lib --enable-bootstrap --with-arch=i686 --with-tune=generic --enable-languages=c,lto,c++,objc,obj-c++,fortran,ada --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw32 --with-mpfr=/mingw32 --with-mpc=/mingw32 --with-isl=/mingw32 --with-pkgversion='Rev1, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld --disable-sjlj-exceptions --with-dwarf2
Thread model: posix
gcc version 6.3.0 (Rev1, Built by MSYS2 project)
Compiled with MinGW32 shell.
g++ -Wall -g -fPIC -std=c++11 -I. ll.cc -shared -o libmylib.a
g++ -Wall -g -std=c++11 -I. -L. -lmylib main.cc -o myexe
I hope this helps you.
Regards,