0

I'm compiling a program with 3 source files: main.cpp, DataHandler.cpp and DataHandler.h.

I use a makefile that contains the following code to build:

Makefile

OBJECTS = main.o DataHandler.o CC = g++ DEBUG = -g CFLAGS = -c -std=c++11 LFLAGS = -lopendnp3 -lopenpal -lasiodnp3 -lasiopal -lpthread -std=c++11 lvoutstation : $(OBJECTS) $(CC) $(LFLAGS) $(OBJECTS) -o lvoutstation main.o : main.cpp DataHandler.h $(CC) $(CFLAGS) main.cpp DataHandler.o : DataHandler.cpp DataHandler.h $(CC) $(CFLAGS) DataHandler.cpp .PHONY : clean clean : rm lvoutstation $(OBJECTS) 

It build main.o and DataHandler.o fine, but when it gets to compiling the action executable, it gives linking erros to all my asiodnp3 and opendnp3 namespace function / class calls.

When I run the following command:

g++ -o lvoutstation main.o DataHandler.o -lopendnp3 -lopenpal -lasiodnp3

-lasiopal -lpthread -std=c++11

It works fine..

I don't understand where the linking error comes in?

EDIT

Upon request for the error message:

g++ -lopendnp3 -lopenpal -lasiodnp3 -lasiopal -std=c++11 main.o DataHandler.o -o lvoutstation main.o: In function `main': main.cpp:(.text+0x85): undefined reference to `asiodnp3::DNP3Manager::DNP3Manager(unsigned int, openpal::ICryptoProvider*, std::function<void ()>, std::function<void ()>)' main.cpp:(.text+0xb7): undefined reference to `asiodnp3::DNP3Manager::AddLogSubscriber(openpal::ILogHandler*)' main.cpp:(.text+0xf0): undefined reference to `opendnp3::ChannelRetry::Default()' main.cpp:(.text+0x123): undefined reference to `asiodnp3::DNP3Manager::AddTCPServer(char const*, unsigned int, opendnp3::ChannelRetry const&, std::string const&, unsigned short)' main.cpp:(.text+0x19f): undefined reference to `opendnp3::EventBufferConfig::AllTypes(unsigned short)' main.cpp:(.text+0x1d6): undefined reference to `opendnp3::DefaultOutstationApplication::Instance()' main.cpp:(.text+0x2c8): undefined reference to `asiodnp3::DNP3Manager::~DNP3Manager()' main.o: In function `opendnp3::LinkConfig::LinkConfig(bool, bool)': main.cpp:(.text._ZN8opendnp310LinkConfigC2Ebb[_ZN8opendnp310LinkConfigC5Ebb]+0x75): undefined reference to `openpal::TimeDuration::Seconds(long)' main.cpp:(.text._ZN8opendnp310LinkConfigC2Ebb[_ZN8opendnp310LinkConfigC5Ebb]+0x87): undefined reference to `openpal::TimeDuration::Minutes(long)' main.o: In function `opendnp3::OutstationConfig::OutstationConfig()': main.cpp:(.text._ZN8opendnp316OutstationConfigC2Ev[_ZN8opendnp316OutstationConfigC5Ev]+0x14): undefined reference to `opendnp3::OutstationParams::OutstationParams()' main.cpp:(.text._ZN8opendnp316OutstationConfigC2Ev[_ZN8opendnp316OutstationConfigC5Ev]+0x56): undefined reference to `opendnp3::EventBufferConfig::EventBufferConfig(unsigned short, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short)' main.o: In function `asiodnp3::ConsoleLogger::Instance()': main.cpp:(.text._ZN8asiodnp313ConsoleLogger8InstanceEv[_ZN8asiodnp313ConsoleLogger8InstanceEv]+0x5): undefined reference to `asiodnp3::ConsoleLogger::instance' DataHandler.o: In function `DataHandler::ReadMeasurements(asiodnp3::IOutstation*)': DataHandler.cpp:(.text+0xfe): undefined reference to `asiodnp3::MeasUpdate::MeasUpdate(asiodnp3::IOutstation*)' DataHandler.cpp:(.text+0x11d): undefined reference to `opendnp3::Analog::Analog(double)' DataHandler.cpp:(.text+0x137): undefined reference to `asiodnp3::MeasUpdate::Update(opendnp3::Analog const&, unsigned short, opendnp3::EventMode)' DataHandler.cpp:(.text+0x159): undefined reference to `asiodnp3::MeasUpdate::~MeasUpdate()' DataHandler.cpp:(.text+0x17b): undefined reference to `asiodnp3::MeasUpdate::~MeasUpdate()' collect2: error: ld returned 1 exit status make: *** [lvoutstation] Error 1 
0

1 Answer 1

1

The makefile just works as expected. Your action becomes actually different from your command line sample

 $(CC) $(LFLAGS) $(OBJECTS) -o lvoutstation 

will expand to

 g++ -lopendnp3 -lopenpal -lasiodnp3 -lasiopal -lpthread -std=c++11 \ main.o DataHandler.o -o lvoutstation 

The order of object files and libraries matters for the linking process.

You can fix the linker errors providing the libraries after the object files:

 $(CC) $(OBJECTS) $(LFLAGS) -o lvoutstation 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.