Error:(199) undefined reference to `__android_log_print'

最近在整合C和C++源文件,cpp目录下有多个子文件,然后如果是子目录出现有Android性质的元素时,就会报错。如下图所示

现在如果子目录里出现Android的LOG的日志时,就会报如下的一个错:

Error:(199) undefined reference to `__android_log_print'

但是我已经在gradle里添加了相应的语句了,还是不行。后来查阅了很多资料,也耗了整天时间,发现如果将所有文件打包成一个库,则不会报错,如果在同一个CMakeList文件里生成多个库的时候,就会报错。

 

解决办法有两种:

第一种就是和我前面所说的,将所有子目录的文件+根目录下所有的文件,都打进一个库里,这样就不会报错了,如下图红框所示,将video_srcs与native-lib打进同一个库。其实这个办法在实际项目中是个不错的办法,因为全部打成一个库,这样别人根据库名字及特征反编译出来就难很多了。所以推荐这个办法;

 

 

另一种就是打成多个库,即cpp目录下,根据逻辑的不同,分有多个子文件夹,然后每个子文件夹都打成一个包。如果这样的话,就必须在每个子文件夹下都对应有一个CMakeList文件才行,可以参考这位大佬的经验:

https://www.jianshu.com/p/f09dbaf72126

如上图所示,即可打包成多个库。

但实测我发现,如果这多个库有互相调用的情况下,会报一些无定义的错(但明明已经定义好的了)。这一点至今我还没弄明白,有哪位高手解决下吧= =

 

查阅资料时,在StackOverflow发现了一个有趣的贴子,就是使用GLOB_RECURSE可以实现根目录、子目录下所有同类的源文件自动添加,如下所示:

file(GLOB_RECURSE cpp_srcs_c "src/main/cpp/*.c")
file(GLOB_RECURSE cpp_srcs_cpp "src/main/cpp/*.cpp")

 

最后附上这个贴子的地址:https://stackoverflow.com/questions/45209369/android-cmakelist-add-multi-source-file

发布了28 篇原创文章 · 获赞 27 · 访问量 6万+
展开阅读全文

C++ 编译错误: Error:undefined reference to ` '

05-08

我编写了一个从list母类继承的链表linkList子类并把声明写在linkList.h文件中,实现写在linkList.cpp中, 但是我发现只用#include "linkList.h"的话会报错如下![图片说明](https://img-ask.csdn.net/upload/201805/08/1525751289_288763.png) 但是如果加上#include "linkList.cpp" 则不会报错。 希望大神告知错误所在,以及教我一下如何正确的书写头文件和源文件! 以下是代码: linkList.h: #ifndef LINKLIST_H_INCLUDED #define LINKLIST_H_INCLUDED class OutOfBound {}; class IllegalSize {}; template <class T> class list { public: virtual int length() const = 0; virtual void clear() = 0; virtual void insert(int i,const T& x) = 0; virtual void remove(int i) = 0; virtual T visit(int i) const = 0; virtual int search(const T& x) const = 0; virtual void traverse() const = 0; virtual ~list() {}; }; template <class T> class linkList:public list<T> { private: struct node { T data; node *prev, *next; node(const T &x, node* p = NULL, node* n = NULL) { data = x; prev = p; next = n; } node():next(NULL), prev(NULL) {} ~node() {} }; node *head, *tail; int currentLength; node* move(int i) const; public: linkList(); ~linkList() { clear(); delete head; delete tail; } int length() const { return currentLength; } void clear(); void insert(int i,const T& x); void remove(int i); T visit(int i) const; int search(const T& x) const; void traverse() const; }; #endif // LINKLIST_H_INCLUDED linkList.cpp: //file: #include <iostream> #include <cstdio> #include "linkList.h" using namespace std; template <class T> typename linkList<T>::node* linkList<T>::move(int i) const { node* p = head -> next; if(i < 0 || i > currentLength) throw OutOfBound(); while(i > 0) { p = p -> next; i--; } return p; } template <class T> linkList<T>::linkList() { head = new node; tail = new node; head -> next = tail; tail -> prev = head; currentLength = 0; } template <class T> void linkList<T>::clear() { node *p, *q; p = head -> next; while(p != tail) { q = p -> next; delete p; p = q; } head -> next = tail; tail -> prev = head; currentLength = 0; } template <class T> void linkList<T>::insert(int i, const T& x) { node *pos = move(i); node *tmp = new node(x, pos -> prev, pos); pos -> prev -> next = tmp; pos -> prev = tmp; ++currentLength; } template <class T> void linkList<T>::remove(int i) { node *pos = move(i); pos -> prev -> next = pos -> next; pos -> next -> prev = pos -> prev; delete pos; --currentLength; } template <class T> int linkList<T>::search(const T& x) const { int i = 0; node* p = head -> next; while(p != tail && p -> data != x) { p = p -> next; i++; } if( p == tail) return -1; else return i; } template <class T> T linkList<T>::visit(int i) const { node* p = move(i); return p -> data; } template <class T> void linkList<T>::traverse() const { node *p = head -> next; while(p != tail) { cout << p -> data << " "; p = p -> next; } cout << endl; } main.cpp: #include <iostream> #include "linkList.h" using namespace std; int main() { linkList<int> l1; int i; char ch; for(i = 0; i < 100; i++) { l1.insert(i, i); } l1.traverse(); ch = cin.get(); for(i = 50; i > 0; i--) { l1.remove(i); } l1.traverse(); ch = cin.get(); cout << l1.length() << endl; ch = cin.get(); for(i = 0; i < l1.length() ; ++i) { cout << l1.visit(i) << endl; } l1.traverse(); ch = cin.get(); for(i = 60; i < 80 ; ++i) { cout << l1.search(i) << endl; } l1.traverse(); ch = cin.get(); return 0; } 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览