精华内容
下载资源
问答
  • c++ 打印日志信息

    2021-12-03 15:55:53
    ofs.open("driver.log", std::ios_base::in | std::ios_base::app); ofs [" ]\t" ; ofs.close(); } 2.日志管理 对于日志文件,一般有两种处理方式,一种就是每次启动软件,清空之前的文件;另一种就是累增。前一种...

    前言:

    C/C++提供了四个宏__FUNCTION__ ,__TIME__ ,__LINE__ ,__FILE__定位程序运行时的错误。程序预编译时预编译器将用所在的函数名,文件名和行号替换。当运行时错误产生后这三个宏分别能返回错误所在的函数,所在的文件名和所在的行号。

    _FUNCTION__ :函数名

    __TIME__ :文件运行的时间 (显示编译的时间)

    __LINE__ :所在行数

    __FILE__:文件的名字

    #include <stdio.h>
    int main(int, char**)
    {
          char str3[256] = { 0 };
        sprintf_s(str3, "This fake error is  on %s  in %s in func %s  on line %d.", __TIME__, __FILE__, __FUNCTION__, __LINE__);
        printf("%s", str3);

       PrintLog(str3);
        return 0;
    }

    This fake error is  on 14:30:56  in f:\test\stdtest\test\test.cpp in func main  on line 18.

    printf 和sprintf 见:CSDNicon-default.png?t=LA92https://mp.csdn.net/mp_blog/creation/editor/121746323

    1.日志打印函数,在日志里添加上C++的编译宏,如上面的4个宏

    void PrintLog(string str)
    {
        SYSTEMTIME sys;
        ::GetLocalTime(&sys);
        std::ofstream ofs;
        ofs.open("driver.log", std::ios_base::in | std::ios_base::app);
        ofs << "[" << sys.wHour << ":" << sys.wMinute << ":" << sys.wSecond << "." << sys.wMilliseconds << "]\t" << str << std::endl;
        ofs.close();
    }

    2.日志管理

    对于日志文件,一般有两种处理方式,一种就是每次启动软件,清空之前的文件;另一种就是累增。前一种的缺点是,长跑测试中,软件崩溃,后来者不小心重启了软件,导致历史日志丢失;后一种的缺陷是,长跑测试,日志文件累增过大,导致磁盘空间不足。

            针对上面两种情况的优缺点,我设计了一种循环记录的方法,类似“行车记录仪”。

     bool CreateLogFile()
    {
         long fileSize = 0;
         HANDLE handle = CreateFile(L"driver.log", FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
         if (handle != INVALID_HANDLE_VALUE)
         {
             fileSize = GetFileSize(handle, NULL);
             cout << fileSize << endl;
             CloseHandle(handle);
         }
         if (fileSize < 200 * 1024 * 1024)    // filesize的单位是byte,设定门限是200M
         {
             PrintLog("---reboot----");
         }
         else
             DeleteFile(L"driver.log");
         return true;
    }

    展开全文
  • Xcode项目使用C++生成 .dylib文件

    千次阅读 2021-12-15 15:03:05
    项目中需要用到Xcode将C++代码输出的Mac版本的DLL文件即DYLIB文件,并能够使用C#代码调用。通过查找相关资料成功实现,这里记录一下Xcode生成的详细步骤,以供后续参考。 创建项目 首先,当然是创建一个Xcode动态库...

    引言

    项目中需要用到Xcode将C++代码输出的Mac版本的DLL文件即DYLIB文件,并能够使用C#代码调用。通过查找相关资料成功实现,这里记录一下Xcode生成的详细步骤,以供后续参考。

    创建项目

    首先,当然是创建一个Xcode动态库项目,这里因为我要生成的是Mac版本,所以我选择的是macOS,其他选项效果后续尝试。然后这里选择Library,然后选择Next。
    生成创建
    下一个界面就是设置项目名称和ID的,然后还需要注意Framework,因为C++代码能够让C#调用,就需要将C++代码外面包一层C语言接口,所以这里选择C/C++ Library
    项目名
    接下里就是项目储存的位置了,这就不多说了。
    位置
    我这里有一个关于Git的界面,直接点击Cancel就可以。
    Git

    创建文件(C++)

    项目创建完成之后,就是创建相关的代码文件,如下,New File…
    New
    选择文件的格式。
    C++
    设置文件名(MacSDK),因为我创建的是C++文件,勾选下面的Also create a header file便会自动生成相应的头文件(.hpp)。
    文件名
    文件位置路径设置。设置好之后,要注意下面的Targets,要勾选相应的Target,不然生成的.dylib文件不会包含相应的代码,这里我勾选了test的Target,那么之后生成的libtest.dylib就会包含MacSDK脚本的代码。点击Create。
    位置
    创建好之后,可以通过TARGETS–>Build Phases界面检测上一步的Target有没有勾选成功或忘记勾选,如下图所示。如果未如图显示,也可以在这个界面手动设置。
    Build Phases

    编辑代码

    这里就是使用一个简单的算数示例代码。

    测试代码头文件(.hpp)

    #ifndef MacSDK_hpp
    #define MacSDK_hpp
    #define _DllExport _declspec(dllexport) //使用宏定义缩写下
    
    #pragma once
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <iostream>
    
    extern "C"
    {
       float GetDistance(float x1, float y1, float x2, float y2);
    }
    
    #endif /* MacSDK_hpp */
    

    测试代码(.cpp)

    #include "MacSDK.hpp"
    
    float GetDistance(float x1, float y1, float x2, float y2)
    {
         return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    }
    

    生成.dylib

    现在就可以生成动态库文件了。
    首先将需要外放的代码头文件拖拽到Public栏下。
    外放
    之后就可以点击Build生成。
    Build
    输入密钥。
    密钥

    输出位置

    .dylib文件的输出位置,如下面两图:Developer–>Xcode–>DeriveData–>对应项目的文件–>Build–>Products–>Debug
    位置1
    与.dylib文件同级的文件夹中usr–>local–>include,就是上面设置的Public栏下的头文件(.hpp)。
    位置2

    参考链接

    1. https://blog.csdn.net/sinat_31177681/article/details/88112123
    2. https://blog.csdn.net/qq981378640/article/details/53908061
    3. https://www.cnblogs.com/0kk470/p/10607544.html
    展开全文
  • 由于历史原因,以及...C++代码调用C代码很简单,只要分别在包含的C头文件的开头和结尾加上如下的两个块:#ifdef __cplusplusextern "C" {#endif和#ifdef __cplusplus}#endif即可。然而为了支持类、重载等更加高级...

    由于历史原因,以及不同开发人员的技术偏好,C语言和C++语言都有一些独有的非常有价值的项目,因而两种语言的互操作,充分利用前人造的轮子是一件非常有价值的事情。

    C++代码调用C代码很简单,只要分别在包含的C头文件的开头和结尾加上如下的两个块:

    #ifdef __cplusplus

    extern "C" {

    #endif

    #ifdef __cplusplus

    }

    #endif

    即可。

    然而为了支持类、重载等更加高级的特性,在编译C++代码时,C++符号会被修饰。我们dump Linux平台加密库 libcrypto++ 的符号表,可以看到如下的内容:

    $ readelf -s /usr/lib/libcrypto++.so

    Symbol table '.dynsym' contains 9607 entries:

    Num: Value Size Type Bind Vis Ndx Name

    0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND

    1: 00000000001daa58 0 SECTION LOCAL DEFAULT 9

    2: 0000000000000000 0 OBJECT GLOBAL DEFAULT UND _ZTIi@CXXABI_1.3 (2)

    3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __errno_location@GLIBC_2.2.5 (3)

    4: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZSt18uncaught_exceptionv@GLIBCXX_3.4 (4)

    5: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt8__detail15_List_node_base7_M_hookEPS0_@GLIBCXX_3.4.15 (5)

    6: 0000000000000000 0 FUNC GLOBAL DEFAULT UND getservbyname@GLIBC_2.2.5 (6)

    7: 0000000000000000 0 FUNC GLOBAL DEFAULT UND bind@GLIBC_2.2.5 (6)

    8: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS_@GLIBCXX_3.4 (4)

    9: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __longjmp_chk@GLIBC_2.11 (7)

    10: 0000000000000000 0 OBJECT GLOBAL DEFAULT UND _ZTIh@CXXABI_1.3 (2)

    11: 0000000000000000 0 OBJECT GLOBAL DEFAULT UND _ZTVSt9basic_iosIcSt11char_traitsIcEE@GLIBCXX_3.4 (4)

    12: 0000000000000000 0 FUNC GLOBAL DEFAULT UND socket@GLIBC_2.2.5 (6)

    13: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@GLIBCXX_3.4 (4)

    . . . . . .

    86: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSo5writeEPKcl@GLIBCXX_3.4 (4)

    87: 0000000000000000 0 FUNC GLOBAL DEFAULT UND malloc@GLIBC_2.2.5 (6)

    88: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E@GLIBCXX_3.4 (4)

    89: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSi5seekgElSt12_Ios_Seekdir@GLIBCXX_3.4 (4)

    90: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_key_delete@GLIBC_2.2.5 (3)

    91: 0000000000000000 0 FUNC GLOBAL DEFAULT UND shutdown@GLIBC_2.2.5 (6)

    92: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZSt15set_new_handlerPFvvE@GLIBCXX_3.4 (4)

    93: 0000000000000000 0 FUNC GLOBAL DEFAULT UND pthread_getspecific@GLIBC_2.2.5 (3)

    94: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strcmp@GLIBC_2.2.5 (6)

    95: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strtol@GLIBC_2.2.5 (6)

    96: 0000000000000000 0 FUNC GLOBAL DEFAULT UND ioctl@GLIBC_2.2.5 (6)

    . . . . . .

    186: 00000000002c5a80 142 FUNC GLOBAL DEFAULT 12 _ZN8CryptoPP6xorbufEPhPKhS2_m

    187: 00000000002fd6d0 9 FUNC WEAK DEFAULT 12 _ZN8CryptoPP21InvertibleRSAFunction9BERDecodeERNS_22BufferedTransformationE

    188: 00000000001ea840 73 FUNC GLOBAL DEFAULT 12 _ZN8CryptoPP13Base64Decoder22GetDecodingLookupArrayEv

    189: 0000000000249760 6 FUNC WEAK DEFAULT 12 _ZThn8_N8CryptoPP13DL_SignerImplINS_25DL_SignatureSchemeOptionsINS_5DL_SSINS_13DL_Keys_ECDSAINS_4EC2NEEENS_18DL_Algorithm_ECDSAIS4_EENS_37DL_SignatureMessageEncodingMethod_DSAENS_6SHA256EiEES5_S7_S8_S9_EEED0Ev

    190: 0000000000278b60 86 FUNC WEAK DEFAULT 12 _ZN8CryptoPP8Rijndael3DecD1Ev

    191: 00000000001fd1f0 2 FUNC WEAK DEFAULT 12 _ZN8CryptoPP23DefaultEncryptorWithMAC8FirstPutEPKh

    192: 000000000026a490 51 FUNC GLOBAL DEFAULT 12 _ZN8CryptoPP23FilterWithBufferedInputC2EPNS_22BufferedTransformationE

    193: 0000000000285180 6 FUNC WEAK DEFAULT 12 _ZNK8CryptoPP8GCM_Base6IVSizeEv

    194: 000000000032e830 510 FUNC WEAK DEFAULT 12 _ZN8CryptoPP18StandardReallocateItNS_20AllocatorWithCleanupItLb0EEEEENT0_7pointerERS3_PT_NS3_9size_typeES8_b

    195: 00000000002a1790 185 FUNC WEAK DEFAULT 12 _ZSt18uninitialized_copyISt15_Deque_iteratorIyRKyPS1_ES0_IyRyPyEET0_T_S9_S8_

    196: 0000000000355610 25 OBJECT WEAK DEFAULT 14 _ZTSN8CryptoPP11RSAFunctionE

    . . . . . .

    这与我们在源文件和头文件里看到的那些函数、类的声明定义都不一样。通过binutils的工具c++filt demangle这些符号可以让我们看到它们在代码里的样子:

    $ c++filt _ZTSN8CryptoPP11RSAFunctionE

    typeinfo name for CryptoPP::RSAFunction

    $ c++filt _ZN8CryptoPP18StandardReallocateItNS_20AllocatorWithCleanupItLb0EEEEENT0_7pointerERS3_PT_NS3_9size_typeES8_b

    CryptoPP::AllocatorWithCleanup::pointer CryptoPP::StandardReallocate >(CryptoPP::AllocatorWithCleanup&, unsigned short*, CryptoPP::AllocatorWithCleanup::size_type, CryptoPP::AllocatorWithCleanup::size_type, bool)

    那到底有没有办法在C代码中调用C++代码呢?方法当然是有的,而且还不止一种。

    通过extern “C”调用

    在 .cpp 文件中定义一个函数,声明为extern "C",则该函数可以方便地在C代码中调用。由于该函数在 .cpp 文件中定义,因而在该函数的实现中,可以调用任意的C++代码,包括C++函数,创建C++类等等。

    C++头文件:

    #ifndef CPPFUNCTIONS_H_

    #define CPPFUNCTIONS_H_

    #ifdef __cplusplus

    int cpp_func(int input);

    extern "C" {

    #endif

    int c_func(int input);

    #ifdef __cplusplus

    }

    #endif

    #endif /* CPPFUNCTIONS_H_ */

    C++实现文件如下:

    #include "CppFunctions.h"

    int cpp_func(int input) {

    return 5;

    }

    int c_func(int input) {

    return cpp_func(input);

    }

    在C代码里调用C++函数:

    #include

    #include "CppFunctions.h"

    int main(int argc, char **argv) {

    printf("%d\n", c_func(10));

    return 0;

    }

    在C++文件里定义的c_func函数就像一座桥一样,连接了C代码的世界和C++代码的世界。但 C 函数c_func的参数及返回值的类型自然是受到一定的限制的,但在函数实现中可以适配要调用的C++接口,做一些适配。

    通过dlopen/dlsym调用

    借助于在 .cpp 文件中定义的C函数,间接地调用C++接口,固然是能实现在 C 代码中调用C++代码的目标,然而还是有些麻烦。通过libdl提供的接口,可以使我们的目标通过更简便的方式实现。

    为dlsym传入经过修饰的符号,可以找到对应的函数的地址。

    通过如下命令将上面的CPPFunctions.cpp文件编译为一个动态链接库:

    $ gcc -shared -fPIC CPPFunctions.cpp -o libCppLibTest.so

    通过dlopen和dlsym找到对应的C++函数,并将其强制类型转换为适当类型的函数指针,然后通过函数指针调用目标函数,如:

    #include

    #include

    int main(int argc, char **argv) {

    void *libCPPTest = dlopen("/home/hanpfei0306/workspace_java/CppLibTest/Debug/libCppLibTest.so", RTLD_NOW);

    int (*cpp_func)(int) = (int (*)(int))dlsym(libCPPTest, "_Z8cpp_funci");

    printf("cpp_func = %p\n", cpp_func);

    printf("cpp_func output = %d\n", cpp_func(10));

    return 0;

    }

    编译并执行上面的代码,在我的机器上可以看到如下的输出:

    cpp_func = 0x7f35727a8650

    cpp_func output = 5

    总结

    以上就是这篇文章的全部内容了,希望本文的的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

    展开全文
  • 互联网上有大量有用的 C++ 库。我们也在这个博客上展示了C++ 的许多伟大用途。C++ 通常具有极高的性能。如果我们有 C++ 库的源代码,我们就可以创建一个包,然后我们就可以在 Delphi 程序中使用 C++。尽管 C++ 库的...

    如何在任何 Delphi 程序中使用 C++ DLL

    互联网上有大量有用的 C++ 库。我们也在这个博客上展示了C++ 的许多伟大用途。C++ 通常具有极高的性能。如果我们有 C++ 库的源代码,我们就可以创建一个包,然后我们就可以在 Delphi 程序中使用 C++。尽管 C++ 库的源代码通常不可用。在商业 C++ 库中,通常只获得几个 C++ 头文件和静态库文件 (.lib),而没有任何随附的 .cpp 源文件。因此,在这种情况下,当我们想在 Delphi 应用程序中使用那些 C++ 库时,我们可以使用代理 DLL 来实现。

    如何创建一个代理DLL来连接C++ DLL和Delphi?

    要将 Delphi 连接到 DLL,DLL 应该公开一个简单的 Windows API 样式 API,而不是 C++ 的东西。我们可以使用任何 C++ 编译器来编译代理 DLL。

    Embarcadero Dev-Cpp 开源编译器

    视觉工作室

    我们举一个简单的例子。假设我们有一个 DLL 文件和一个带有此声明的更难的文件,而没有带有实现的 .cpp 文件。您可以在此链接中参考此示例的源代码:

    https://github.com/PacktPublishing/Delphi-High-Performance/tree/master/Chapter%208/StaticLib1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #pragma once
    class CppClass
    {
      int data;
    public:
      CppClass();
      ~CppClass();
      void setData(int);
      int getSquare();
    };

    下面介绍如何在带有代理dll的Delphi程序中使用C++库

    现在我们需要创建代理DLL。

    使用您喜欢的 IDE 创建一个新的 C++ DLL 项目。

    如何在任何 Delphi 程序中使用 C++ DLL = 新的代理 DLL 项目

    它会自动添加“dllmain.cpp”文件。但是我们需要另一个单元来包装静态库。添加名为“StaticLibWrapper.cpp”的新单元。

    现在我们应该在我们的项目中包含我们想要导入的静态库的头文件。

    1
    2
    #include "stdafx.h"
    #include "CppClass.h"

    现在将静态库的头文件复制到项目文件夹中。现在我们应该在我们的项目中包含静态库。为此,将静态库文件夹添加到库目录中:

    如何在任何 Delphi 程序中使用 C++ DLL - import-static-library

    或者在 Visual Studio 中转到“配置属性 链接器 一般 其他库目录 设置”。

    如何将 C++ DLL 函数标记为“已导出”

    现在我们定义一个宏来标记 DLL 函数被导出。

    1
    #define EXPORT comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)

    接下来,实现IndexAllocator类以缓存 C++ 对象。这个类包含一个指针数组。它具有“Allocate”、“Release”和“Get”三个函数,用于将指针存储在缓存中、释放缓存和通过索引获取指针。

    1
    2
    3
    bool Allocate(int&amp; deviceIndex, void* obj)
    bool Release(int deviceIndex)
    void* Get(int deviceIndex)

    然后我们需要 toInitialize和 Finalize 函数来分配和释放IndexAllocator对象。

    1
    2
    extern "C" int WINAPI Initialize()
    extern "C" int WINAPI Finalize()

    然后我们创建一个 CppClass 类的实例,并用这个函数将它存储在缓存中。

    1
    extern "C" int WINAPI CreateCppClass (int&amp; index)

    在此语句中,我们使用“C”来确保导出相同的名称并WINAPI更改调用转换。DestroyCppClass 与此类似。接下来,看看主要的导出函数“CppClass_setValue”和“CppClass_getSquare”。当用户调用这些函数时,它会从缓存中获取对象并调用这些函数并取值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    extern "C" int WINAPI CppClass_setValue(int index, int value)
    {
    #pragma EXPORT
      CppClass* instance = (CppClass*)GAllocator-&gt;Get(index);
      if (instance == NULL)
        return -1;
      else {
        instance-&gt;setData(value);
        return 0;
      }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    extern "C" int WINAPI CppClass_getSquare(int index, int&amp; value)
    {
    #pragma EXPORT
      CppClass* instance = (CppClass*)GAllocator-&gt;Get(index);
      if (instance == NULL)
        return -1;
      else {
        value = instance-&gt;getSquare();
        return 0;
      }
    }

    第一个函数将获取对象的索引并设置变量的值。在第二个函数中,它获取对象的索引,调用对象的“ getSquare”函数,并将值存储在值变量中。

    如何在 Delphi 应用程序中使用 C++ 代理 DLL?

    我们可以静态或动态链接 DLL。对于静态加载,DLL 将在应用程序启动时加载。使用动态加载,DLL 将不会加载,直到我们调用“LoadLibrary”。让我们在这个例子中使用静态加载。让我们声明在 DLL 中导出的函数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    const
    CPP_CLASS_LIB = 'DllLib1.dll';
    function Initialize: integer;
      stdcall; external CPP_CLASS_LIB name 'Initialize' delayed;
     
    function Finalize: integer;
      stdcall; external CPP_CLASS_LIB name 'Finalize' delayed;
     
    function CreateCppClass(var index: integer): integer;
      stdcall; external CPP_CLASS_LIB name 'CreateCppClass' delayed;
     
    function DestroyCppClass(index: integer): integer;
      stdcall; external CPP_CLASS_LIB name 'DestroyCppClass' delayed;
     
    function CppClass_setValue(index: integer; value: integer): integer;
      stdcall; external CPP_CLASS_LIB name 'CppClass_setValue' delayed;
     
    function CppClass_getSquare(index: integer; var value: integer): integer;
      stdcall; external CPP_CLASS_LIB name 'CppClass_getSquare' delayed;

    我们应该在 Delphi 应用程序创建时调用“Initialize”函数,在我们的应用程序销毁时调用“Finalize”函数。然后当我们在 Delphi 代码中使用代理 DLL 时,首先我们必须调用“CreateCppClass”来创建一个对象。它将设置将来使用的类 ID。然后我们可以调用DLL的所有函数,最后我们应该调用“DestroyCppClass”函数来销毁类实例。颈椎枕在我们的例子中,我们这样做:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    procedure TfrmCppClassDemo.btnImportLibClick(Sender: TObject);
    var
    idxClass: Integer;
    value: Integer;
    begin
    if CreateCppClass(idxClass) &lt;&gt; 0 then
      ListBox1.Items.Add('CreateCppClass failed')
    else if CppClass_setValue(idxClass, SpinEdit1.Value) &lt;&gt; 0 then
      ListBox1.Items.Add('CppClass_setValue failed')
    else if CppClass_getSquare(idxClass, value) &lt;&gt; 0 then
      ListBox1.Items.Add('CppClass_getSquare failed')
    else begin
      ListBox1.Items.Add(Format('square(%d) = %d', [SpinEdit1.Value, value]));
      if DestroyCppClass(idxClass) &lt;&gt; 0 then
       ListBox1.Items.Add('DestroyCppClass failed')
    end;
    end;

    最后,Delphi 应用程序将像这样工作:

    如何在任何 Delphi 程序中使用 C++ DLL = delphi cppclass import


    RAD Studio 允许您快速创建可在 Windows、macOS、Linux、iOS 和 Android 上运行的 Delphi 和 C++ 程序。立即下载免费试用版,将您的程序创意带到客户实际使用的设备上!


    使用 RAD Studio、Delphi 或 C++Builder 缩短开发时间并更快地进入市场。
    设计。编码。编译。部署。

     

     

    展开全文
  • 于是决定使用C/C++完成加密解密,其他平台调用的方式进行处理。加密解密实现AES加密的具体实现过程本文暂不讨论,实现代码是直接从openssl源码中抽出来。加密解密调用以下两个方法:int aes_encrypt(char * in, c...
  • C++ 头文件系列(ios)

    2020-12-19 13:48:18
    而这些basic_XXX类模版又都是继承自同一个基类模版----basic_ios。2 basic_ios模版定义这个基类模版应该是出于可重用的目的。2.1 成员类型char_type : 字符类型,即第一个模版参数。char_traits : 萃...
  • 深入浅出 iOS 编译

    2021-05-22 08:09:39
    前言两年前曾经写过一篇关于编译的文章《iOS编译过程的原理和应用》,这篇文章介绍了iOS编译相关基础知识和简单应用,但也很有多问题都没有解释清楚:Clang和LLVM究竟是什么源文件到机器码的细节Linker做了哪些工作...
  • iOS项目中的核心用c++的库,例如ffmpeg,那么如何在Swift中调用c++库就是一个大问题了。因为Objective-c和c++都是c体系,他们两之间的调用还算是方便。所以,要首先要解决的是Swift和objective-c之间的调用问题。 ...
  • Metal 开发 | 使用 C++ 进行接口调用~~

    千次阅读 2021-11-30 00:25:07
    同时要下载好 Metal 对应的 C++ 头文件(metal-cpp),链接地址如下: https://developer.apple.com/metal/cpp/files/metal-cpp_macOS12_iOS15.zip 创建工程 创建一个 macOS 上的工程,可以是 App 工程也可以是...
  • #define GetNSValueFromCType(cValue) ([NSValue value:&cValue withObjCType:@encode(typeof(cValue))]) #define SetCValueFromNSValue(ocValue, cValue) [ocValue getValue:&cValue] ...
  • ARKit使用, YUA转RGB, CVPixelBuffer使用, iOS配合C++开发游戏等问题。 iOS相机输出流的格式转换 在iOS中普通相机和AR相机默认输出的类型是 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange 和...
  • 这是一个调用c++ jni 的列子首先写一个GoodLuck 类,里面包含native本地方法,这是用作C/C++实现的。也就是用C/c++实现java的native方法。public class GoodLuck {private String string="";private int num;public ...
  • 利用Boost::Python实现C++调用python接口2019年11月06日阅读数:7这篇文章主要向大家介绍利用Boost::Python实现C++调用python接口,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。...
  • 情景一: 为什么外界修改了变量 a 的值, 调用block时打印的值不变? #import "BlockClass.h" @implementation BlockClass + (void) funcTest { int a = 10; NSLog(@"a1: %p, %d", &a,a); void(^blockName)(void...
  • Cocos2d—X调用java一、C++端1、在.h文件中包含对应的文件#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)#include #include "platform/android/jni/JniHelper.h"#include #endif2、在.cpp文件里,你需要调用的...
  • C++标准库中 ios_base 的用法

    千次阅读 2021-02-10 14:29:19
    C++程序设计时,一般不会直接调用std::ios_base的成员函数,但是会经常用到该类中定义的各种流的数据格式的枚举值常量。如ios_base::hex、ios_base::skipws等等。 在类std::ios_base中,保存了下述关于流的信息: 1...
  • C++ 调用json

    2021-04-20 17:00:46
    fout.open(filePath, ios::binary); assert(fout.is_open()); Json::Value root; root["name"] = 0; std::string out = root.toStyledString(); fout ; cout ; } void readJson() { Json::...
  • c++有2种加载dll的方法:动态加载DLL和静态加载DLL 1、动态加载DLL的步骤如下: void DynamicUse() { HMODULE module = LoadLibrary(L"VideoNetClient.dll"); if (module == NULL) { printf("加载...
  • 很多想开发IOS,或者正在开发IOS的程序员以前都做过Java或者C++,当第一次看到Objective-C的代码时都会头疼,Objective-C的代码在语法上和Java, C++有着很大的区别,有的同学会感觉像是看天书一样。不过,语言都是...
  • iOS开发探索-Runtime原理解读及实践iOS开发探索-Runtime原理解读及实践我们初次接触runtime,听起来总是那么神秘高级,各种论坛对runtime介绍数不胜数。笔者今天对"高大上"的runtime进行简单的梳理,如有不足,欢迎各位...
  • 使用 C++ 进行跨平台移动开发11/14/2019本文内容你可以使用 Visual Studio 中提供的跨平台工具为 iOS、Android 和 Windows 设备生成本机 C++ 应用。 使用 C++ 的移动开发是 Visual Studio 安装程序中提供的一种工作...
  • 生成exe的代码 #include <iostream> #include<string> #include<fstream> using namespace std;... std::ifstream in("D:\\wth\\callexe\\Release\\123.txt", ios::binary); if
  • ios获取系统通讯录

    2020-12-21 14:10:08
    ios9之前AddressBook,后Contacts#import #import /// iOS 9的新框架#import #import @interface AddressViewController ()@end@implementation AddressViewController- (void)viewDidLoad {[super viewDidLoad];...
  • [ios2]iphone编程中使用封装的NSLog来打印调试信息 【转】 使用NSLog的一个风险是:它的运行会占用时间和设备资源. 简单而粗暴的解决方案是:在release前,将所有的NSLog注释掉.简单有效,但副作用是:下次你要调试时,又...
  • 阅读本文前先看这篇文章:c++调用百度AI OCR SDK 一.鉴权认证机制 1.百度通用参考:鉴权认证机制 简介 本文档主要针对HTTP API调用者,百度AIP开放平台使用OAuth2.0授权调用开放API,调用API时必须在URL中带上...
  • 1.静态库工程的建立 Xcode New一个新的project,选择IOS下面的Framework&Library,下面有一个Cocoa Touch Static Library。直接next去建立一个Print...C++脚本(被调用):PatchLoader.h #pragma once //Bridge.h
  • 输出程序运行时调用栈信息 可以通过命令man backtrace查看具体帮忙信息。 #include <execinfo.h> int backtrace(void **buffer, int size); char **backtrace_symbols(void *const *buffer, int size); ...
  • 无论是桌面系统:MacOS,Linux,Windows,还是移动操作系统:Android,iOS,都存在进程和线程的概念。 进程(英语:process),是指计算机中已运行的程序。进程为曾经是分时系统的基本运作单位。在面向进程设计的...
  • 在C语言中调用C++做的动态链接库今天在做东西的时候遇到一个问题,就是如何在C语言中调用C++做的动态链接库so文件如果你有一个c++做的动态链接库.so文件,而你只有一些相关类的声明, 那么你如何用c调用呢,别着急,本文...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,918
精华内容 19,567
关键字:

ios调用c++

c++ 订阅
友情链接: biwohu225.rar