C++ динамическая общая библиотека по Linux

Метод Selenium getText () всегда возвращает строковое значение. Вы можете преобразовать строковое значение json в объект JSON, используя любую библиотеку JSON.

Здесь я использовал библиотеку org.json .

public static void main(String[] args) {
    System.setProperty("webdriver.chrome.driver","/Users/lulu/Desktop/Selenium/chromedriver");
    WebDriver driver = new ChromeDriver();
    driver.get("http://localhost:8080/game");
    driver.manage().window().maximize();
    String text = driver.findElement(By.cssSelector("pre")).getText();
    System.out.println(text);
    JSONObject jsonobject = new JSONObject(text);
    System.out.println(jsonobject.getString("text"));
    System.out.println(jsonobject.getInt("id"));
}

JSONObject jsonobject = new JSONObject (text) - Здесь мы создаем объект JSON.

163
задан Community 23 May 2017 в 10:31
поделиться

3 ответа

myclass.h

#ifndef __MYCLASS_H__
#define __MYCLASS_H__

class MyClass
{
public:
  MyClass();

  /* use virtual otherwise linker will try to perform static linkage */
  virtual void DoSomething();

private:
  int x;
};

#endif

myclass.cc

#include "myclass.h"
#include <iostream>

using namespace std;

extern "C" MyClass* create_object()
{
  return new MyClass;
}

extern "C" void destroy_object( MyClass* object )
{
  delete object;
}

MyClass::MyClass()
{
  x = 20;
}

void MyClass::DoSomething()
{
  cout<<x<<endl;
}

class_user.cc

#include <dlfcn.h>
#include <iostream>
#include "myclass.h"

using namespace std;

int main(int argc, char **argv)
{
  /* on Linux, use "./myclass.so" */
  void* handle = dlopen("myclass.so", RTLD_LAZY);

  MyClass* (*create)();
  void (*destroy)(MyClass*);

  create = (MyClass* (*)())dlsym(handle, "create_object");
  destroy = (void (*)(MyClass*))dlsym(handle, "destroy_object");

  MyClass* myClass = (MyClass*)create();
  myClass->DoSomething();
  destroy( myClass );
}

На Mac OS X, скомпилируйте с:

g++ -dynamiclib -flat_namespace myclass.cc -o myclass.so
g++ class_user.cc -o class_user

На Linux, скомпилируйте с:

g++ -fPIC -shared myclass.cc -o myclass.so
g++ class_user.cc -ldl -o class_user

, Если бы это было для сменной системы, Вы использовали бы MyClass в качестве базового класса и определили бы все необходимые виртуальные функции. Сменный автор затем произошел бы из MyClass, переопределил бы virtuals и реализацию create_object и destroy_object. Ваше главное приложение не должно было бы быть изменено всегда.

152
ответ дан codelogic 23 November 2019 в 21:19
поделиться

Следующие шоу пример общей библиотеки классов совместно используются. [h, cpp] и main.cpp модуль, пользующийся библиотекой. Это - очень простой пример, и make-файл мог быть сделан намного лучше. Но это работает и может помочь Вам:

shared.h определяет класс:

class myclass {
   int myx;

  public:

    myclass() { myx=0; }
    void setx(int newx);
    int  getx();
};

shared.cpp определяет функции getx/setx:

#include "shared.h"

void myclass::setx(int newx) { myx = newx; }
int  myclass::getx() { return myx; }

main.cpp использует класс,

#include <iostream>
#include "shared.h"

using namespace std;

int main(int argc, char *argv[])
{
  myclass m;

  cout << m.getx() << endl;
  m.setx(10);
  cout << m.getx() << endl;
}

и make-файл, который генерирует libshared.so и ссылки, основные с общей библиотекой:

main: libshared.so main.o
    $(CXX) -o main  main.o -L. -lshared

libshared.so: shared.cpp
    $(CXX) -fPIC -c shared.cpp -o shared.o
    $(CXX) -shared  -Wl,-soname,libshared.so -o libshared.so shared.o

clean:
    $rm *.o *.so

К фактическому 'основному' выполнению и ссылка с libshared.so необходимо будет, вероятно, указать путь загрузки (или поместить его в/usr/local/lib или подобный).

следующее указывает текущий каталог как путь поиска для библиотек и работает основной (синтаксис удара):

export LD_LIBRARY_PATH=.
./main

, Чтобы видеть, что программа связана с libshared.so, можно попробовать ldd:

LD_LIBRARY_PATH=. ldd main

Печать на моей машине:

  ~/prj/test/shared$ LD_LIBRARY_PATH=. ldd main
    linux-gate.so.1 =>  (0xb7f88000)
    libshared.so => ./libshared.so (0xb7f85000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7e74000)
    libm.so.6 => /lib/libm.so.6 (0xb7e4e000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0xb7e41000)
    libc.so.6 => /lib/libc.so.6 (0xb7cfa000)
    /lib/ld-linux.so.2 (0xb7f89000)
52
ответ дан ashgkwd 23 November 2019 в 21:19
поделиться

В основном необходимо включать заголовочный файл класса в код, где Вы хотите использовать класс в общей библиотеке. Затем когда Вы связываетесь, используют '-l' флаг для соединения кода с общей библиотекой. Конечно, это требует, чтобы .so был, где ОС может найти его. См. 3.5. Установка и пользование Общей Библиотекой

Используя dlsym для того, когда Вы не знаете во время компиляции, какой библиотекой Вы хотите пользоваться. Это не кажется, что имеет место здесь. Возможно, беспорядок состоит в том, что Windows называет динамично загруженные библиотеки, делаете ли Вы соединение в компиляции или времени выполнения (с аналогичными методами)? Если так, затем можно думать о dlsym как об эквиваленте LoadLibrary.

, Если действительно необходимо динамично загрузить библиотеки (т.е. они - плагины), затем этот FAQ должен помочь.

8
ответ дан Matt Lewis 23 November 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: