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
Then, you can define a kCount variable in the ll.cc
This is my gcc version information
Compiled with MinGW32 shell.
I hope this helps you.
Regards,