小编kic*_*r86的帖子

我可以在C程序中使用C++创建的共享库吗?

我正在使用C创建程序.但是,我需要使用许多只有C++的API.那么,我是否有可能在C++中创建共享对象,然后使用C访问其功能?

  1. 我将传递和返回的唯一数据是C兼容的数据类型.
  2. 转换或迁移到cpp不是一个选项.

如果无法连接这些代码,我如何从C++代码获取信息到C代码?我尝试从C调用C++函数,但是当我包含时,我在链接期间遇到错误<string>.所以当我从C调用C++函数时,我应该只使用那些与C编译器兼容的代码吗?

C++头文件cppfile.hpp

#ifndef CPPFILE_H
#define CPPFILE_H
    #ifdef __cplusplus
    extern "C" {
    #endif

    extern int myfunction(const char *filename);

   #ifdef __cplusplus
   }
   #endif
#endif
Run Code Online (Sandbox Code Playgroud)

C++文件cppfile.cpp

#include "cppfile.hpp"
#include <string>
int myfunction(const char *filename) {
    String S(filename);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

C文件cmain.c

#include "cppfile.hpp"
int main(int argc, char **argv)
{
     int i = myfunction(argv[1]);
     printf("%d\n", i);
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译:

gcc -c cmain.c
g++ -fPIC -shared -o cppfile.so cppfile.cpp
Run Code Online (Sandbox Code Playgroud)

c c++ compilation shared-libraries

29
推荐指数
2
解决办法
2万
查看次数

多进程内容提供程序同步到默认值

根据Android文档:

机器人:多进程

是否可以在每个客户端进程中创建内容提供程序的实例 - 如果实例可以在多个进程中运行,则为"true",否则为"false".默认值为"false".

通常,内容提供程序在定义它的应用程序的过程中实例化.但是,如果此标志设置为"true",则系统可以在每个进程中创建一个实例,其中有一个客户端想要与之交互,从而避免进程间通信的开销.

因此,如果将此属性设置为,true则将在每个进程中创建Content Provider的实例.

问题1此实例是对内容提供商的引用还是整个内容提供商的副本?

问题2系统如何处理同步更改回到默认/原始实现?数据源(SQLite等)是否负责多进程读/写?

问题3这更像是一种有根据的猜测.最初,在拥有内容提供商的应用程序中存在内容提供者实例.每当其他应用程序与之交互时,它们就会通过IPC实现,这意味着:

other app --> IPC --> content provider --> data source
Run Code Online (Sandbox Code Playgroud)

multiprocess="true"被设置时,系统将在每个过程中,内容提供商的副本.因此,应用程序不必通过IPC与内容提供商进行交互.

other app ---> content provider ---> data source
Run Code Online (Sandbox Code Playgroud)

内容提供商仍然可以直接访问数据源.在这种情况下,其方法必须是线程/进程安全的,因为其他应用程序也将访问它.

如果这种情况是正确的,那么这个线程安全实现是否与线程安全的默认要求不同?

multithreading android android-contentprovider

10
推荐指数
1
解决办法
1483
查看次数

添加共享库路径到Makefile

我想将共享库路径添加到我的Makefile中.我已经在makefile中输入了export命令,它甚至被调用,但我仍然需要再次手动导出它.什么是正确的方法?

Makefile文件:

SOURCES = kwest_main.c fusefunc.c dbfuse.c logging.c dbbasic.c dbinit.c dbkey.c metadata_extract.c plugins_extraction.c import.c

LIBS = -L$(LIB) -lfuse -lsqlite3 -lkw_taglib -ltag_c -ltag -Wl,-rpath=.

INCLUDE = ../include
LIB = ../lib

EXE = kwest

CC = gcc

CCFLAGS = -g -Wall -Wextra -std=gnu99 -pedantic-errors -I$(INCLUDE)

OFLAGS = -c

ARCH = $(shell getconf LONG_BIT)

X = -D_FILE_OFFSET_BITS=$(ARCH)

OBJECTS = $(SOURCES:.c=.o)

$(EXE) : $(OBJECTS)
    $(CC) -o $(EXE) $(OBJECTS) $(LIBS)

%.o: %.c
    $(CC) $(OFLAGS) $(CCFLAGS) $< 

fusefunc.o: fusefunc.c
    $(CC) $(OFLAGS) $(CCFLAGS) $< $X

kwest_libs: kw_taglib …
Run Code Online (Sandbox Code Playgroud)

makefile

7
推荐指数
2
解决办法
4万
查看次数

如何计算Python函数的算法复杂度?

当需要显示算法的效率时,我们需要显示函数的算法复杂性 - 大O等.在Python代码中,我们如何显示或计算函数的边界?

python complexity-theory big-o

6
推荐指数
1
解决办法
2万
查看次数

valgrind给出大小为1的无效读取

我已经经历了几个有关相同错误代码的类似问题,最关心的是传递无效指针地址.但是,这看起来并非如此,因为我的程序正确地处理了传递的任何地址.

FORMAT_STRING:

static char *format_string(char *string)
{
    int i;

    if (string == NULL) {
        return string;
    }
    string[0] = (char)toupper((int)string[0]);

    111->for (i = 1; string[i] != '\0'; i++) {
        if (!isalpha(string[i-1])) {
            string[i] = (char)toupper((int)string[i]);
        } else {
            string[i] = (char)tolower((int)string[i]);
        }
        if (string[i] == '/' || string[i] == '\\') {
        string[i] = ' ';
        }
    }
    /* Remove End of string White Spaces */
    while (string[--i]==' '); string[++i]='\0';

    return string;
}
Run Code Online (Sandbox Code Playgroud)

metadata_extract:

static int metadata_extract(const char *filename, struct kw_metadata …
Run Code Online (Sandbox Code Playgroud)

c malloc valgrind memory-leaks

-1
推荐指数
1
解决办法
1万
查看次数