undefined reference to std::experimental::net - c++

the code is like this
#include <experimental/net>
#include <iostream>
#include <string>
#include <chrono>
namespace net = std::experimental::net;
using namespace std::chrono_literals;
int main()
{
std::cout << "networking ts stream example" << std::endl;
net::ip::tcp::iostream s;
s.expires_after(5s);
s.connect("ipecho.net", "http");
if(!s) {
std::cout << "error: " << s.error().message() << std::endl;
return -1;
}
s << "GET /plain HTTP/1.0\r\n";
s << "Host: ipecho.net\r\n";
s << "Accept: */*\r\n";
s << "Connection: close\r\n\r\n";
std::string header;
while(s && std::getline(s, header) && header != "\r")
std::cout << header << "\n";
std::cout << s.rdbuf();
std::cout << std::endl;
}
I have tried complier it by tdm-gcc 10 , fedora g++ (GCC) 11.2.1 and g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0.All of them failed,and the output are like this:
/usr/bin/ld: /tmp/ccUtsmxu.o: in function `std::experimental::net::v1::basic_socket_iostream<std::experimental::net::v1::ip::tcp, std::chrono::_V2::steady_clock, std::experimental::net::v1::wait_traits<std::chrono::_V2::steady_clock> >::basic_socket_iostream()':
a.cpp:(.text._ZNSt12experimental3net2v121basic_socket_iostreamINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEEC1Ev[_ZNSt12experimental3net2v121basic_socket_iostreamINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEEC1Ev]+0xd1): undefined reference to `std::experimental::net::v1::basic_socket_streambuf<std::experimental::net::v1::ip::tcp, std::chrono::_V2::steady_clock, std::experimental::net::v1::wait_traits<std::chrono::_V2::steady_clock> >::~basic_socket_streambuf()'
/usr/bin/ld: /tmp/ccUtsmxu.o: in function `void std::experimental::net::v1::basic_socket_iostream<std::experimental::net::v1::ip::tcp, std::chrono::_V2::steady_clock, std::experimental::net::v1::wait_traits<std::chrono::_V2::steady_clock> >::connect<char const (&) [10], char const (&) [5]>(char const (&) [10], char const (&) [5])':
a.cpp:(.text._ZNSt12experimental3net2v121basic_socket_iostreamINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEE7connectIJRA10_KcRA5_SC_EEEvDpOT_[_ZNSt12experimental3net2v121basic_socket_iostreamINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEE7connectIJRA10_KcRA5_SC_EEEvDpOT_]+0x4f): undefined reference to `std::experimental::net::v1::basic_socket_streambuf<std::experimental::net::v1::ip::tcp, std::chrono::_V2::steady_clock, std::experimental::net::v1::wait_traits<std::chrono::_V2::steady_clock> >* std::experimental::net::v1::basic_socket_streambuf<std::experimental::net::v1::ip::tcp, std::chrono::_V2::steady_clock, std::experimental::net::v1::wait_traits<std::chrono::_V2::steady_clock> >::connect<char const (&) [10], char const (&) [5]>(char const (&) [10], char const (&) [5])'
/usr/bin/ld: /tmp/ccUtsmxu.o: in function `std::experimental::net::v1::basic_socket_iostream<std::experimental::net::v1::ip::tcp, std::chrono::_V2::steady_clock, std::experimental::net::v1::wait_traits<std::chrono::_V2::steady_clock> >::~basic_socket_iostream()':
a.cpp:(.text._ZNSt12experimental3net2v121basic_socket_iostreamINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEED1Ev[_ZNSt12experimental3net2v121basic_socket_iostreamINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEED1Ev]+0x4d): undefined reference to `std::experimental::net::v1::basic_socket_streambuf<std::experimental::net::v1::ip::tcp, std::chrono::_V2::steady_clock, std::experimental::net::v1::wait_traits<std::chrono::_V2::steady_clock> >::~basic_socket_streambuf()'
/usr/bin/ld: /tmp/ccUtsmxu.o:(.data.rel.ro._ZTVNSt12experimental3net2v122basic_socket_streambufINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEEE[_ZTVNSt12experimental3net2v122basic_socket_streambufINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEEE]+0x10): undefined reference to `std::experimental::net::v1::basic_socket_streambuf<std::experimental::net::v1::ip::tcp, std::chrono::_V2::steady_clock, std::experimental::net::v1::wait_traits<std::chrono::_V2::steady_clock> >::~basic_socket_streambuf()'
/usr/bin/ld: /tmp/ccUtsmxu.o:(.data.rel.ro._ZTVNSt12experimental3net2v122basic_socket_streambufINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEEE[_ZTVNSt12experimental3net2v122basic_socket_streambufINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEEE]+0x18): undefined reference to `std::experimental::net::v1::basic_socket_streambuf<std::experimental::net::v1::ip::tcp, std::chrono::_V2::steady_clock, std::experimental::net::v1::wait_traits<std::chrono::_V2::steady_clock> >::~basic_socket_streambuf()'
/usr/bin/ld: /tmp/ccUtsmxu.o:(.data.rel.ro._ZTVNSt12experimental3net2v122basic_socket_streambufINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEEE[_ZTVNSt12experimental3net2v122basic_socket_streambufINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEEE]+0x28): undefined reference to `std::experimental::net::v1::basic_socket_streambuf<std::experimental::net::v1::ip::tcp, std::chrono::_V2::steady_clock, std::experimental::net::v1::wait_traits<std::chrono::_V2::steady_clock> >::setbuf(char*, long)'
/usr/bin/ld: /tmp/ccUtsmxu.o:(.data.rel.ro._ZTVNSt12experimental3net2v122basic_socket_streambufINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEEE[_ZTVNSt12experimental3net2v122basic_socket_streambufINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEEE]+0x40): undefined reference to `std::experimental::net::v1::basic_socket_streambuf<std::experimental::net::v1::ip::tcp, std::chrono::_V2::steady_clock, std::experimental::net::v1::wait_traits<std::chrono::_V2::steady_clock> >::sync()'
/usr/bin/ld: /tmp/ccUtsmxu.o:(.data.rel.ro._ZTVNSt12experimental3net2v122basic_socket_streambufINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEEE[_ZTVNSt12experimental3net2v122basic_socket_streambufINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEEE]+0x58): undefined reference to `std::experimental::net::v1::basic_socket_streambuf<std::experimental::net::v1::ip::tcp, std::chrono::_V2::steady_clock, std::experimental::net::v1::wait_traits<std::chrono::_V2::steady_clock> >::underflow()'
/usr/bin/ld: /tmp/ccUtsmxu.o:(.data.rel.ro._ZTVNSt12experimental3net2v122basic_socket_streambufINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEEE[_ZTVNSt12experimental3net2v122basic_socket_streambufINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEEE]+0x68): undefined reference to `std::experimental::net::v1::basic_socket_streambuf<std::experimental::net::v1::ip::tcp, std::chrono::_V2::steady_clock, std::experimental::net::v1::wait_traits<std::chrono::_V2::steady_clock> >::pbackfail(int)'
/usr/bin/ld: /tmp/ccUtsmxu.o:(.data.rel.ro._ZTVNSt12experimental3net2v122basic_socket_streambufINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEEE[_ZTVNSt12experimental3net2v122basic_socket_streambufINS1_2ip3tcpENSt6chrono3_V212steady_clockENS1_11wait_traitsIS7_EEEE]+0x78): undefined reference to `std::experimental::net::v1::basic_socket_streambuf<std::experimental::net::v1::ip::tcp, std::chrono::_V2::steady_clock, std::experimental::net::v1::wait_traits<std::chrono::_V2::steady_clock> >::overflow(int)'
collect2: error: ld returned 1 exit status
what's wrong with them? My complier option is '-std=gnu++2a' or '-std=c++2a',both do not work.

Related

Issues with Makefile C++ using mingw-32

I'm very new to C++. I am having some trouble with using a makefile to compile my C++ project. The project consists of: main.cpp, position.cpp, movegen.cpp, move.cpp and their respective headers. I am using Windows and mingw-64.
Here is the makefile I have written:
CXX = g++
CXXFLAGS = -Wall -g
all: main
main: main.o position.o movegen.o move.o
$(CXX) $(CXXFLAGS) -o main main.o position.o movegen.o move.o
main.o: main.cpp position.h movegen.h move.h
$(CXX) $(CXXFLAGS) -c main.cpp
position.o: position.cpp position.h move.h
$(CXX) $(CXXFLAGS) -c position.cpp
movegen.o: movegen.cpp movegen.h position.h move.h
$(CXX) $(CXXFLAGS) -c movegen.cpp
move.o: move.cpp move.h
$(CXX) $(CXXFLAGS) -c move.cpp
Here is a very messy dependency diagram, each file is dependent on the one with a line drawn below it downwards e.g. movegen depends on position and move headers.
When I try running the mingw-64_make.exe command in the directory of the project, all of the object files are created successfully, but main.exe is not.
This is the console output:
C:\Users\Hutch\pepegaengine>mingw32-make.exe
g++ -Wall -g -c main.cpp
main.cpp: In static member function 'static void TestEngine::displayBB(U64)':
main.cpp:22:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'unsigned int'} [-Wsign-compare]
for (int j = 0; j < eightBit.length(); j++) {
~~^~~~~~~~~~~~~~~~~~~
g++ -Wall -g -c position.cpp
position.cpp: In member function 'void Position::unmakeMove(cmove::Move)':
position.cpp:771:30: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
} else if (flags = capture) {
~~~~~~^~~~~~~~~
position.cpp:766:17: warning: unused variable 'toPiece' [-Wunused-variable]
int toPiece = move.getToPiece();
^~~~~~~
g++ -Wall -g -c movegen.cpp
movegen.cpp: In function 'cmove::Move* cmovegen::legalMoveGenerator(cposition::Position&, cposition::enumColour, cmove::Move*)':
movegen.cpp:9:13: warning: unused variable 'enemyPawns' [-Wunused-variable]
U64 enemyPawns = pos.getPieceSet(blackPawns - colourMove);
^~~~~~~~~~
g++ -Wall -g -c move.cpp
g++ -Wall -g -o main main.o position.o movegen.o move.o
main.o: In function `main':
C:\Users\Hutch\pepegaengine/main.cpp:34: undefined reference to `cposition::Position::Position(unsigned long long*)'
C:\Users\Hutch\pepegaengine/main.cpp:35: undefined reference to `cposition::Position::initializeStartPosition()'
C:\Users\Hutch\pepegaengine/main.cpp:39: undefined reference to `cposition::Position::getEmptyBB()'
C:\Users\Hutch\pepegaengine/main.cpp:42: undefined reference to `cposition::Position::getOccupiedBB()'
C:\Users\Hutch\pepegaengine/main.cpp:108: undefined reference to `cmove::Move::Move()'
C:\Users\Hutch\pepegaengine/main.cpp:109: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/main.cpp:110: undefined reference to `cposition::Position::makeMove(cmove::Move)'
C:\Users\Hutch\pepegaengine/main.cpp:112: undefined reference to `cmovegen::legalMoveGenerator(cposition::enumColour, cmove::Move*)'
C:\Users\Hutch\pepegaengine/main.cpp:115: undefined reference to `cmove::Move::getFrom()'
C:\Users\Hutch\pepegaengine/main.cpp:116: undefined reference to `cmove::Move::getTo()'
C:\Users\Hutch\pepegaengine/main.cpp:121: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/main.cpp:122: undefined reference to `cposition::Position::makeMove(cmove::Move)'
C:\Users\Hutch\pepegaengine/main.cpp:124: undefined reference to `cmovegen::legalMoveGenerator(cposition::enumColour, cmove::Move*)'
C:\Users\Hutch\pepegaengine/main.cpp:127: undefined reference to `cmove::Move::getFrom()'
C:\Users\Hutch\pepegaengine/main.cpp:128: undefined reference to `cmove::Move::getTo()'
movegen.o: In function `ZN8cmovegen18legalMoveGeneratorERN9cposition8PositionENS0_10enumColourEPN5cmove4MoveE':
C:\Users\Hutch\pepegaengine/movegen.cpp:8: undefined reference to `cposition::Position::getPieceSet(int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:9: undefined reference to `cposition::Position::getPieceSet(int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:22: undefined reference to `cposition::Position::getEmptyBB()'
C:\Users\Hutch\pepegaengine/movegen.cpp:22: undefined reference to `cposition::Position::singlePushTargets(unsigned long long, unsigned long long, cposition::enumColour)'
C:\Users\Hutch\pepegaengine/movegen.cpp:23: undefined reference to `cposition::Position::getEmptyBB()'
C:\Users\Hutch\pepegaengine/movegen.cpp:23: undefined reference to `cposition::Position::doublePushTargets(unsigned long long, unsigned long long, cposition::enumColour)'
C:\Users\Hutch\pepegaengine/movegen.cpp:24: undefined reference to `cposition::Position::pawnCaptures(unsigned long long, cposition::enumColour)'
C:\Users\Hutch\pepegaengine/movegen.cpp:25: undefined reference to `cposition::Position::pawnAllAttacks(unsigned long long, cposition::enumColour)'
C:\Users\Hutch\pepegaengine/movegen.cpp:25: undefined reference to `cposition::Position::getEnPassantTarget()'
C:\Users\Hutch\pepegaengine/movegen.cpp:28: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:47: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:48: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:49: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:50: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
movegen.o:C:\Users\Hutch\pepegaengine/movegen.cpp:56: more undefined references to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)' follow
movegen.o: In function `ZN8cmovegen18legalMoveGeneratorERN9cposition8PositionENS0_10enumColourEPN5cmove4MoveE':
C:\Users\Hutch\pepegaengine/movegen.cpp:72: undefined reference to `cposition::Position::pieceOnSquare(unsigned long long)'
C:\Users\Hutch\pepegaengine/movegen.cpp:76: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:77: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:78: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:79: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:85: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:95: undefined reference to `cposition::Position::getPieceSet(int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:102: undefined reference to `cposition::Position::getOccupiedBB()'
C:\Users\Hutch\pepegaengine/movegen.cpp:102: undefined reference to `cposition::Position::rookCaptures(unsigned long long, int, cposition::enumColour)'
C:\Users\Hutch\pepegaengine/movegen.cpp:103: undefined reference to `cposition::Position::getOccupiedBB()'
C:\Users\Hutch\pepegaengine/movegen.cpp:103: undefined reference to `cposition::Position::rookQuietMoves(unsigned long long, int, cposition::enumColour)'
C:\Users\Hutch\pepegaengine/movegen.cpp:108: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:114: undefined reference to `cposition::Position::pieceOnSquare(unsigned long long)'
C:\Users\Hutch\pepegaengine/movegen.cpp:114: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:121: undefined reference to `cposition::Position::getPieceSet(int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:126: undefined reference to `cposition::Position::getOccupiedBB()'
C:\Users\Hutch\pepegaengine/movegen.cpp:126: undefined reference to `cposition::Position::queenCaptures(unsigned long long, int, cposition::enumColour)'
C:\Users\Hutch\pepegaengine/movegen.cpp:127: undefined reference to `cposition::Position::getOccupiedBB()'
C:\Users\Hutch\pepegaengine/movegen.cpp:127: undefined reference to `cposition::Position::queenQuietMoves(unsigned long long, int, cposition::enumColour)'
C:\Users\Hutch\pepegaengine/movegen.cpp:130: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:136: undefined reference to `cposition::Position::pieceOnSquare(unsigned long long)'
C:\Users\Hutch\pepegaengine/movegen.cpp:136: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:144: undefined reference to `cposition::Position::getPieceSet(int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:149: undefined reference to `cposition::Position::getOccupiedBB()'
C:\Users\Hutch\pepegaengine/movegen.cpp:149: undefined reference to `cposition::Position::bishopCaptures(unsigned long long, int, cposition::enumColour)'
C:\Users\Hutch\pepegaengine/movegen.cpp:150: undefined reference to `cposition::Position::getOccupiedBB()'
C:\Users\Hutch\pepegaengine/movegen.cpp:150: undefined reference to `cposition::Position::bishopQuietMoves(unsigned long long, int, cposition::enumColour)'
C:\Users\Hutch\pepegaengine/movegen.cpp:153: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:159: undefined reference to `cposition::Position::pieceOnSquare(unsigned long long)'
C:\Users\Hutch\pepegaengine/movegen.cpp:159: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:167: undefined reference to `cposition::Position::getPieceSet(int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:173: undefined reference to `cposition::Position::singleKnightQuietMoves(int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:174: undefined reference to `cposition::Position::singleKnightCaptures(int, cposition::enumColour)'
C:\Users\Hutch\pepegaengine/movegen.cpp:177: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:183: undefined reference to `cposition::Position::pieceOnSquare(unsigned long long)'
C:\Users\Hutch\pepegaengine/movegen.cpp:183: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:191: undefined reference to `cposition::Position::getPieceSet(int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:192: undefined reference to `cposition::Position::kingQuietMoves(unsigned long long)'
C:\Users\Hutch\pepegaengine/movegen.cpp:193: undefined reference to `cposition::Position::kingCaptures(unsigned long long, cposition::enumColour)'
C:\Users\Hutch\pepegaengine/movegen.cpp:196: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:197: undefined reference to `cposition::Position::getOccupiedBB()'
C:\Users\Hutch\pepegaengine/movegen.cpp:197: undefined reference to `cposition::Position::isAttackedSquare(unsigned long long, int, int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:205: undefined reference to `cposition::Position::pieceOnSquare(unsigned long long)'
C:\Users\Hutch\pepegaengine/movegen.cpp:205: undefined reference to `cmove::Move::Move(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)'
C:\Users\Hutch\pepegaengine/movegen.cpp:206: undefined reference to `cposition::Position::getOccupiedBB()'
C:\Users\Hutch\pepegaengine/movegen.cpp:206: undefined reference to `cposition::Position::isAttackedSquare(unsigned long long, int, int)'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe: *** [makefile:12: main] Error 1
main.cpp:
#include <iostream>
#include <iostream>
#include <bitset>
#include "position.h"
#include "movegen.h"
#include "move.h"
using namespace cmove;
using namespace cposition;
using namespace cmovegen;
using namespace std;
int main() {
U64 pieceBB[14];
Position pos(pieceBB);
pos.initializeStartPosition();
cout << "empty: " << endl;
TestEngine::displayBB(pos.getEmptyBB());
cout << "occupied: " << endl;
TestEngine::displayBB(pos.getOccupiedBB());
Move moves[150];
Move d4(11,27, quietMove, whitePawns, 0);
pos.makeMove(d4);
legalMoveGenerator(white, moves);
...
position.cpp:
#include<string>
#include "position.h"
#define C64(constantU64) constantU64##ULL
typedef unsigned long long U64;
using namespace std;
using namespace cmove;
using namespace cposition;
class Position {
U64 pieceBB[14];
U64 emptyBB;
U64 occupiedBB;
U64 enPassantTarget;
bool castleRights[4];
U64 arrPawnAttacks[2][64];
U64 arrKnightAttacks[64];
U64 arrKingAttacks[64];
public:
U64 getEmptyBB() {
return emptyBB;
}
U64 getOccupiedBB() {
return occupiedBB;
}
U64 getPieceSet(int piece) {
return pieceBB[piece];
}
...
position.h:
#ifndef POSITION
#define POSITION
#define C64(constantU64) constantU64##ULL
typedef unsigned long long U64;
#include "move.h"
namespace cposition {
typedef unsigned long long U64;
enum enumPiece {
whitePieces,
blackPieces,
whitePawns,
blackPawns,
whiteRooks,
blackRooks,
whiteKnights,
blackKnights,
whiteBishops,
blackBishops,
whiteQueens,
blackQueens,
whiteKing,
blackKing,
};
enum enumSquare {
a1, b1, c1, d1, e1, f1, g1, h1,
a2, b2, c2, d2, e2, f2, g2, h2,
a3, b3, c3, d3, e3, f3, g3, h3,
a4, b4, c4, d4, e4, f4, g4, h4,
a5, b5, c5, d5, e5, f5, g5, h5,
a6, b6, c6, d6, e6, f6, g6, h6,
a7, b7, c7, d7, e7, f7, g7, h7,
a8, b8, c8, d8, e8, f8, g8, h8
};
enum enumDirection {
n,
ne,
e,
se,
s,
sw,
w,
nw
};
enum enumColour {
white,
black
};
enum enumFlag {
quietMove,
doublePawnPush,
kingCastle,
queenCastle,
capture,
epCapture,
knightPromotion,
bishopPromotion,
rookPromotion,
queenPromotion,
knightPromoCapture,
bishopPromoCapture,
rookPromoCapture,
queenPromoCapture
};
enum enumCastleRights {
whiteKingsideCastleRights,
blackKingsideCastleRights,
whiteQueensideCastleRights,
blackQueensideCastleRights
};
class Position {
U64 pieceBB[14];
U64 emptyBB;
U64 occupiedBB;
U64 enPassantTarget;
bool castleRights[4];
U64 arrPawnAttacks[2][64];
U64 arrKnightAttacks[64];
U64 arrKingAttacks[64];
public:
U64 getEmptyBB();
U64 getOccupiedBB();
U64 getPieceSet(int piece);
U64 getEnPassantTarget();
...
movegen.cpp:
#include <math.h>
#include "movegen.h"
using namespace cmove;
using namespace cposition;
namespace cmovegen {
cmove::Move * legalMoveGenerator(Position& pos, enumColour colourMove, Move * moves) {
U64 pawns = pos.getPieceSet(whitePawns + colourMove);
U64 enemyPawns = pos.getPieceSet(blackPawns - colourMove);
U64 pawnPush = 0;
U64 pawnDoublePush = 0;
U64 pawnCap = 0;
U64 pawnEP = 0;
//TestEngine::displayBB(pawns);
//TestEngine::displayBB(enemyPawns);
while (pawns) {
U64 currentPawn = pawns & -pawns;
pawnPush = pos.singlePushTargets(currentPawn, pos.getEmptyBB(), colourMove);
pawnDoublePush = pos.doublePushTargets(currentPawn, pos.getEmptyBB(), colourMove);
pawnCap = pos.pawnCaptures(currentPawn, colourMove);
pawnEP = pos.pawnAllAttacks(currentPawn, colourMove) & pos.getEnPassantTarget();
if (pawnEP) {
Move newMove (log2(currentPawn), log2(pawnEP), epCapture, (whitePawns + colourMove), (blackPawns - colourMove));
*moves++ = newMove;
}
...
movegen.h:
#ifndef MOVEGEN
#define MOVEGEN
#include "position.h"
namespace cmovegen {
cmove::Move * legalMoveGenerator(cposition::enumColour colourMove, cmove::Move * moves);
}
#endif
move.cpp:
#include "move.h"
using namespace cmove;
class Move {
unsigned int move24 = 0;
public:
Move() {
move24 = 0;
}
Move(unsigned int from, unsigned int to, unsigned int flags, unsigned int fromPiece, unsigned int toPiece) {
move24 = ((flags & 0xf) << 20) | ((from & 0x3f) << 14) | ((to & 0x3f) << 8) | ((fromPiece & 0xf) << 4) | (toPiece & 0xf);
}
unsigned int getFrom() {
return (move24 >> 14) & 0x3f;
}
unsigned int getTo() {
return (move24 >> 8) & 0x3f;
}
unsigned int getFlags() {
return (move24 >> 20) & 0xf;
}
unsigned int getFromPiece() {
return (move24 >> 4) & 0xf;
}
unsigned int getToPiece() {
return move24 & 0xf;
}
void setFrom(unsigned int from) {
move24 &= 0xf03fff;
move24 |= ((from & 0x3f) << 14);
}
void setTo(unsigned int to) {
move24 &= 0xffc0ff;
move24 |= ((to & 0x3f) << 8);
}
void setFlags(unsigned int flags) {
move24 &= 0x0fffff;
move24 |= ((flags & 0xf) << 20);
}
void setFromPiece(unsigned int fromPiece) {
move24 &= 0xffff0f;
move24 |= ((fromPiece & 0xf) << 4);
}
void setToPiece(unsigned int toPiece) {
move24 &= 0xfffff0;
move24 |= (toPiece & 0xf);
}
};
move.h:
#ifndef MOVE
#define MOVE
namespace cmove {
class Move {
unsigned int move24;
public:
Move();
Move(unsigned int from, unsigned int to, unsigned int flags, unsigned int fromPiece, unsigned int toPiece);
unsigned int getFrom();
unsigned int getTo();
unsigned int getFlags();
unsigned int getFromPiece();
unsigned int getToPiece();
void setFrom(unsigned int from);
void setTo(unsigned int to);
void setFlags(unsigned int flags);
void setFromPiece(unsigned int fromPiece);
void setToPiece(unsigned int toPiece);
};
}
#endif

C++ template construction for class member lists

So I have made a little bit of C++ templates before: some quite basic examples of the curiously recurring template pattern for classes of mathematical numbers. This time I tried using the same pattern to create a list or "network" for objects of a class which they could add themselves to and look around for other objects. I thought I could use a static std::list to do this. So my attempt goes like this:
template<class C> class HasNetwork{
public:
HasNetwork(){}
static list<C*> m;
};
template<class C> list<C*> HasNetwork<C>::m = list<C*>();
class IHaveNetwork: public HasNetwork<IHaveNetwork>{
public:
IHaveNetwork(){ m.push_back(this); }
};
int main(){
IHaveNetwork lHF, lHF2;
//for(list<IHaveNetwork*>::iterator it = lHF.m->begin(); ; it++);
return 0;
}
It seems to compile, but I get nasty link errors ( even with the for loop iterator commented out ). Maybe I need to do some cast or maybe "this" is not defined until after the constructor finishes?
Here is the link error:
/tmp/templatest-912860.o: In function `__clang_call_terminate':
templatest.cpp:
(.text.__clang_call_terminate[__clang_call_terminate]+0x9): undefined reference to `__cxa_begin_catch'
templatest.cpp:(.text.__clang_call_terminate[__clang_call_terminate]+0x12): undefined reference to `std::terminate()'
/tmp/templatest-912860.o: In function `__gnu_cxx::new_allocator<std::_List_node<IHaveNetwork*>
>::deallocate(std::_List_node<IHaveNetwork*>*, unsigned long)':
templatest.cpp:
(.text._ZN9__gnu_cxx13new_allocatorISt10_List_nodeIP12IHaveNetworkEE10deallocateEPS4_m[_ZN9__gnu_cxx13new_allocatorISt10_List_nodeIP12IHaveNetworkEE10deallocateEPS4_m]+0x1c): undefined reference to `operator delete(void*)'
/tmp/templatest-912860.o: In function `std::list<IHaveNetwork*, std::allocator<IHaveNetwork*>
>::_M_insert(std::_List_iterator<IHaveNetwork*>, IHaveNetwork* const&)':
templatest.cpp:
(.text._ZNSt4listIP12IHaveNetworkSaIS1_EE9_M_insertESt14_List_iteratorIS1_ERKS1_[_ZNSt4listIP12IHaveNetworkSaIS1_EE9_M_insertESt14_List_iteratorIS1_ERKS1_]+0x31): undefined reference to
`std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)'
/tmp/templatest-912860.o: In function `std::list >::_M_create_node(IHaveNetwork* const&)':
templatest.cpp:
(.text._ZNSt4listIP12IHaveNetworkSaIS1_EE14_M_create_nodeERKS1_[_ZNSt4listIP12IHaveNetworkSaIS1_EE14_M_create_nodeERKS1_]+0xa0): undefined reference to `__cxa_begin_catch'
templatest.cpp:(.text._ZNSt4listIP12IHaveNetworkSaIS1_EE14_M_create_nodeERKS1_[_ZNSt4listIP12IHaveNetworkSaIS1_EE14_M_create_nodeERKS1_]+0xbb): undefined reference to `__cxa_rethrow'
templatest.cpp:
(.text._ZNSt4listIP12IHaveNetworkSaIS1_EE14_M_create_nodeERKS1_[_ZNSt4listIP12IHaveNetworkSaIS1_EE14_M_create_nodeERKS1_]+0xce): undefined reference to `__cxa_end_catch'
/tmp/templatest-912860.o: In function `__gnu_cxx::new_allocator<std::_List_node<IHaveNetwork*> >::allocate(unsigned long, void const*)':
templatest.cpp:(.text._ZN9__gnu_cxx13new_allocatorISt10_List_nodeIP12IHaveNetworkEE8allocateEmPKv[_ZN9__gnu_cxx13new_allocatorISt10_List_nodeIP12IHaveNetworkEE8allocateEmPKv]+0x33): undefined reference to `std::__throw_bad_alloc()'
templatest.cpp:(.text._ZN9__gnu_cxx13new_allocatorISt10_List_nodeIP12IHaveNetworkEE8allocateEmPKv[_ZN9__gnu_cxx13new_allocatorISt10_List_nodeIP12IHaveNetworkEE8allocateEmPKv]+0x40): undefined reference to `operator new(unsigned long)'
/tmp/templatest-912860.o:(.eh_frame+0x13): undefined reference to `__gxx_personality_v0'
I cannot reproduce.
Here is a slightly modified version of you code that compiles links and runs without even a warning (I only had to fix some indirection level errors):
#include <iostream>
#include <list>
#include <string>
template<class C> class HasNetwork{
public:
HasNetwork(){}
static std::list<C*> m;
};
template<class C> std::list<C*> HasNetwork<C>::m = std::list<C*>();
class IHaveNetwork: public HasNetwork<IHaveNetwork>{
std::string name;
public:
IHaveNetwork(const std::string &name): name(name) { m.push_back(this); }
std::string getName() const {
return name;
}
};
int main(){
IHaveNetwork lHF("foo"), lHF2("bar");
for(std::list<IHaveNetwork*>::iterator it = lHF.m.begin(); it != lHF.m.end(); it++) {
std::cout << (*it)->getName() << std::endl;
}
return 0;
}

Cannot get min_element to work in C++

I'm writing a small recursive algorithm. Here is the code:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> coins;
int checkchange(int left) {
vector<int> choices (coins.size());
if (left == 0)
return 0;
else {
int min;
for (int i=0;i<coins.size();i++) {
choices.at(i) = (1 + checkchange(left - coins.at(i)));
}
return min_element(choices.front(),choices.back());
}
}
int main() {
int N;
cin >> N;
for (int i=0;i<N;i++) {
int c,m,temp,change;
cin >> c >> m;
for (int j=0;j<c;j++) {
cin >> temp;
coins.push_back(temp);
}
for (int j=0;j<m;j++) {
cin >> temp;
change = checkchange(temp);
cout << change;
}
}
return 0;
}
I get the following error:
In file included from
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/algorithm:62,
from burningcoins.cpp:3: /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_algo.h:
In function ‘_FIter std::min_element(_FIter, _FIter) [with _FIter =
int]’: burningcoins.cpp:19: instantiated from here
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_algo.h:5998:
error: invalid type argument of ‘unary *’
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_algo.h:5998:
error: invalid type argument of ‘unary *’
I've tried compiling with both g++ and gcc, both give me the same error. What am I doing wrong?
Edit:
New Code:
int checkchange(int left) {
vector<int> choices (coins.size());
if (left == 0)
return 0;
else {
for (int i=0;i<coins.size();i++) {
choices[i] = (1 + checkchange(left - coins.at(i)));
}
return *min_element(choices.begin(), choices.end());
}
}
New error message:
/tmp/ccV3VLsK.o: In function main': <br/>
burningcoins.cpp:(.text+0x16a): undefined reference tostd::cin'
burningcoins.cpp:(.text+0x16f): undefined reference to std::basic_istream<char, std::char_traits<char> >::operator>>(int&)' <br/>
burningcoins.cpp:(.text+0x187): undefined reference tostd::cin'
burningcoins.cpp:(.text+0x18c): undefined reference to std::basic_istream<char, std::char_traits<char> >::operator>>(int&)' <br/>
burningcoins.cpp:(.text+0x19b): undefined reference tostd::basic_istream >::operator>>(int&)'
burningcoins.cpp:(.text+0x1b0): undefined reference to std::cin' <br/>
burningcoins.cpp:(.text+0x1b5): undefined reference tostd::basic_istream >::operator>>(int&)'
burningcoins.cpp:(.text+0x1ec): undefined reference to std::cin' <br/>
burningcoins.cpp:(.text+0x1f1): undefined reference tostd::basic_istream >::operator>>(int&)'
burningcoins.cpp:(.text+0x208): undefined reference to std::cout' <br/>
burningcoins.cpp:(.text+0x20d): undefined reference tostd::basic_ostream >::operator<<(int)'
/tmp/ccV3VLsK.o: In function __static_initialization_and_destruction_0(int, int)': <br/>
burningcoins.cpp:(.text+0x261): undefined reference tostd::ios_base::Init::Init()'
burningcoins.cpp:(.text+0x266): undefined reference to std::ios_base::Init::~Init()' <br/>
/tmp/ccV3VLsK.o: In functionstd::vector >::_M_range_check(unsigned long) const':
burningcoins.cpp:(.text._ZNKSt6vectorIiSaIiEE14_M_range_checkEm[std::vector >::_M_range_check(unsigned long) const]+0x2d): undefined reference to std::__throw_out_of_range(char const*)' <br/>
/tmp/ccV3VLsK.o: In functionstd::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, int const&)':
burningcoins.cpp:(.text._ZNSt6vectorIiSaIiEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPiS1_EERKi[std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, int const&)]+0x259): undefined reference to __cxa_begin_catch' <br/>
burningcoins.cpp:(.text._ZNSt6vectorIiSaIiEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPiS1_EERKi[std::vector<int, std::allocator<int> >::_M_insert_aux(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, int const&)]+0x2be): undefined reference to__cxa_rethrow'
burningcoins.cpp:(.text._ZNSt6vectorIiSaIiEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPiS1_EERKi[std::vector >::_M_insert_aux(__gnu_cxx::__normal_iterator > >, int const&)]+0x2c8): undefined reference to __cxa_end_catch' <br/>
/tmp/ccV3VLsK.o: In functionstd::vector >::_M_check_len(unsigned long, char const*) const':
burningcoins.cpp:(.text._ZNKSt6vectorIiSaIiEE12_M_check_lenEmPKc[std::vector >::_M_check_len(unsigned long, char const*) const]+0x4c): undefined reference to std::__throw_length_error(char const*)' <br/>
/tmp/ccV3VLsK.o: In function__gnu_cxx::new_allocator::deallocate(int*, unsigned long)':
burningcoins.cpp:(.text._ZN9__gnu_cxx13new_allocatorIiE10deallocateEPim[__gnu_cxx::new_allocator::deallocate(int*, unsigned long)]+0x1c): undefined reference to operator delete(void*)' <br/>
/tmp/ccV3VLsK.o: In function__gnu_cxx::new_allocator::allocate(unsigned long, void const*)':
burningcoins.cpp:(.text._ZN9__gnu_cxx13new_allocatorIiE8allocateEmPKv[__gnu_cxx::new_allocator::allocate(unsigned long, void const*)]+0x35): undefined reference to std::__throw_bad_alloc()' <br/>
burningcoins.cpp:(.text._ZN9__gnu_cxx13new_allocatorIiE8allocateEmPKv[__gnu_cxx::new_allocator<int>::allocate(unsigned long, void const*)]+0x45): undefined reference tooperator new(unsigned long)'
/tmp/ccV3VLsK.o:(.eh_frame+0x12): undefined reference to __gxx_personality_v0' <br/>
/tmp/ccV3VLsK.o:(.eh_frame+0x4f): undefined reference to__gxx_personality_v0'
collect2: ld returned 1 exit status
std::min_element takes a range. front and back return references to actual values. You should be using the begin and end methods to return an iterator to the corresponding positions in the vector:
min_element(choices.begin(), choices.end());
// ^^^^^ ^^^
If you find this tedious, you can create a function which wraps around the standard min_element:
template <class Container>
auto min_element(Container c) -> decltype(std::min_element(c.begin(), c.end()))
{
return std::min_element(c.begin(), c.end());
}
And use it as:
min_element(choices);

function invoking undefined reference

hi every one I have this class with those headers
class WuManber
{
public:
WuManber( void );
virtual ~WuManber( void );
void Initialize( const vector<const char *> &patterns,
bool bCaseSensitive = false, bool bIncludeSpecialCharacters = false, bool bIncludeExtendedAscii = false );
when I try try to create an instance of WuManber and invoke Initialize I get the following error:
/tmp/ccx19Os5.o: In function main': Test.cpp:(.text+0x8d): undefined
reference toWuManber::WuManber()' Test.cpp:(.text+0xbc): undefined
reference to WuManber::Initialize(std::vector<char const*,
std::allocator<char const*> > const&, bool, bool, bool)'
Test.cpp:(.text+0xc8): undefined reference toWuManber::~WuManber()'
Test.cpp:(.text+0x115): undefined reference to `WuManber::~WuManber()'
collect2: ld returned 1 exit status
int main(int argc, char* argv[])
{
Parser CustomParserEx;
CustomParserEx.open("/home/abdullah/Project IDS/rules");
WuManber WmAlgorithm;
WmAlgorithm.Initialize(CustomParserEx.patterns,true,true,true);
}
so any hints of what I am doing wrong
You didn't implement the three methods of WuManber, or you didn't include the implementations where the linker can find them.

Using gcc/g++ instrument functions with MinGW?

i try to use the gcc instrument functions with g++ compiler of MinGW, but i
always got linker issues. Is it possible to use the instrument functions with
MinGW/MSYS?
The linker failure output:
$ g++ instrumentFunctions.cpp -o iftest -finstrument-functions >> iflog.txt
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x4e): undefined reference to `__cyg_prof
ile_func_enter'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x158): undefined reference to `__cyg_pro
file_func_exit'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x179): undefined reference to `__cyg_pro
file_func_enter'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x18c): undefined reference to `__cyg_pro
file_func_exit'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x1a7): undefined reference to `__cyg_pro
file_func_enter'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x1bf): undefined reference to `__cyg_pro
file_func_exit'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x1db): undefined reference to `__cyg_pro
file_func_enter'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x1f3): undefined reference to `__cyg_pro
file_func_exit'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x22f): undefined reference to `__cyg_pro
file_func_enter'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x27a): undefined reference to `__cyg_pro
file_func_exit'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x29b): undefined reference to `__cyg_pro
file_func_enter'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x2e4): undefined reference to `__cyg_pro
file_func_exit'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x2ff): undefined reference to `__cyg_pro
file_func_enter'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x326): undefined reference to `__cyg_pro
file_func_exit'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x341): undefined reference to `__cyg_pro
file_func_enter'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text+0x368): undefined reference to `__cyg_pro
file_func_exit'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text$printf[_printf]+0x16): undefined referenc
e to `__cyg_profile_func_enter'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text$printf[_printf]+0x43): undefined referenc
e to `__cyg_profile_func_exit'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text$_ZSt3minIjERKT_S2_S2_[unsigned int const&
std::min<unsigned int>(unsigned int const&, unsigned int const&)]+0x15): undefined reference to `__cyg_profile_func_ent
er'
C:/Users/HELLHO~1/AppData/Local/Temp/ccUwxrxt.o:instrumentFunctions.cpp:(.text$_ZSt3minIjERKT_S2_S2_[unsigned int const&
std::min<unsigned int>(unsigned int const&, unsigned int const&)]+0x42): undefined reference to `__cyg_profile_func_exi
t'
collect2: ld returned 1 exit status
g++ command i use:
g++ iftest.cpp -o iftest -finstruction-functions
Listing of my testsource:
#include <stdio.h>
void __cyg_profile_func_enter( void *, void * ) __attribute__ ((no_instrument_function));
void __cyg_profile_func_enter(void *func, void *callsite)
{
printf("%p\n", (int)func);
}
void func_c( void )
{
return;
}
void func_b( void )
{
func_c();
return;
}
void func_a( void )
{
func_b();
return;
}
int main()
{
func_a();
func_c();
}
You need to give the __cyg* functions "C" linkage. A function defined in C++ normally gets a mangled name which can't be used from libraries not written in C++. You can ask the compiler to give a function the name C would give it by using an `extern "C"{} block. The following should compile fine.
#include <stdio.h>
extern "C" {
void __cyg_profile_func_enter( void *, void * ) __attribute__ ((no_instrument_function));
void __cyg_profile_func_enter(void *func, void *callsite)
{
printf("enter %p\n", func);
}
void __cyg_profile_func_exit( void *, void * ) __attribute__ ((no_instrument_function));
void __cyg_profile_func_exit(void *func, void *callsite)
{
printf("exit %p\n", func);
}
}
void func_c( void )
{
return;
}
void func_b( void )
{
func_c();
return;
}
void func_a( void )
{
func_b();
return;
}
int main()
{
func_a();
func_c();
}